POSIX pthread
簡介:
線程庫提供了三種同步機制:
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 <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 <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