POSIX pthread
libraries
是基於標準的線程API的C / C ++。並發執行。這是最有效多處理器或多核心系統的工藝流程,在另一個處理器上運行,從而通過並行或分布式的處理速度越來越快。
簡介:
線程庫提供了三種同步機制:
mutexes: 互斥鎖:主要是阻止其他線程訪問變數,強制線程獨佔一個變數或一組變數
join: 使一個線程等待,直達其他線程完成或者終止(exit(0));
contidion variables: 條件變數,資料類型為 phread_cond_t
詳細介紹:
mutexes: 多線程在同一時間在同一塊記憶體地區操作資料,防止資料的不一致. 掙用或者競爭情況 通常發生在多線程,執行的操作在相同的記憶體地區,比如修改通一個狀態變數。鎖主要是鎖住共用資源, 對於多線程訪問的全家變數,需要添加鎖。看代碼理解
沒有鎖程式碼片段
int counter =0;
void updateCounter()
{
counter++
};
帶鎖程式碼片段
pthread_mutex_t mutext =PTHREAD_MUTEX_INITIALIZER
int counter =0;
void updateCounter()
{
pthread_mutex_lock(&mutext);
counter++
pthread_mutex_unlock(&mutext);
};
重點說明
pthread_mutex_lock() : 獲得指定的互斥變數上的鎖。如果該互斥已經被另一個線程鎖定,這個調用會阻塞調用線程,直到互斥量被釋放
pthread_mutex_unlock() - 解除鎖定的互斥變數。如果已經解鎖或由另一個線程擁有互斥,則返回一個錯誤
pthread_mutex_trylock() - 試圖鎖定一個互斥體,會返回錯誤碼。主要用於防止死結條件
互斥鎖Demo
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void * updateCounter();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter =0;
main(){
int rc1,rc2;
pthread_t thread1,thread2;
if( (rc1=pthread_create( &thread1, NULL, &updateCounter, NULL)) )
{
printf("Thread creation failed: %d\n", rc1);
}
if( (rc2=pthread_create( &thread2, NULL, &updateCounter, NULL)) )
{
printf("Thread creation failed: %d\n", rc2);
}
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(0);
}
void * updateCounter(){
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}
gcc -lpthread mutex1.c -o mutext.out
輸出:
DavidYang:項目 weflytotti$ ./mutext.out
Counter value: 1
Counter value: 2
Joins Demo
Joins:等待其他線程完成,一個線程發送器可以啟動多個線程,然後等待他們完成
具體代碼
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void *thread_function(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
pthread_t thread_id[NTHREADS];
int i, j;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, thread_function, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}
printf("Final counter value: %d\n", counter);
}
void *thread_function(void *dummyPtr)
{
printf("Thread number %ld\n", pthread_self());
pthread_mutex_lock( &mutex1 );
counter++;
pthread_mutex_unlock( &mutex1 );
}
輸出:
gcc -lpthread join.c -o join.out
DavidYang:項目 weflytotti$ ./join.out
Thread number 4304330752
Thread number 4305981440
Thread number 4306518016
Thread number 4307054592
Thread number 4307591168
Thread number 4308127744
Thread number 4308664320
Thread number 4309200896
Thread number 4309737472
Thread number 4310274048
Final counter value: 10