使用線程間通信,在才確定的代碼位置使用mutex就可以完成你所要的功能。
線程互斥
互斥意味著“排它”,即兩個(gè)線程不能同時(shí)進(jìn)入被互斥保護(hù)的代碼。Linux下可以通過(guò)pthread_mutex_t 定義互斥體機(jī)制完成多線程的互斥操作,該機(jī)制的作用是對(duì)某個(gè)需要互斥的部分,在進(jìn)入時(shí)先得到互斥體,如果沒(méi)有得到互斥體,表明互斥部分被其它線程擁有,此時(shí)欲獲取互斥體的線程阻塞,直到擁有該互斥體的線程完成互斥部分的操作為止。
下面的代碼實(shí)現(xiàn)了對(duì)共享全局變量x 用互斥體mutex 進(jìn)行保護(hù)的目的:
int x; // 進(jìn)程中的全局變量
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //按缺省的屬性初始化互斥體變量mutex
pthread_mutex_lock(&mutex); // 給互斥體變量加鎖
… //對(duì)變量x 的操作
phtread_mutex_unlock(&mutex); // 給互斥體變量解除鎖
線程同步
同步就是線程等待某個(gè)事件的發(fā)生。只有當(dāng)?shù)却氖录l(fā)生線程才繼續(xù)執(zhí)行,否則線程掛起并放棄處理器。當(dāng)多個(gè)線程協(xié)作時(shí),相互作用的任務(wù)必須在一定的條件下同步。
Linux下的C語(yǔ)言編程有多種線程同步機(jī)制,最典型的是條件變量(condition variable)。pthread_cond_init用來(lái)創(chuàng)建一個(gè)條件變量,其函數(shù)原型為:
pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);
pthread_cond_wait和pthread_cond_timedwait用來(lái)等待條件變量被設(shè)置,值得注意的是這兩個(gè)等待調(diào)用需要一個(gè)已經(jīng)上鎖的互斥體mutex,這是為了防止在真正進(jìn)入等待狀態(tài)之前別的線程有可能設(shè)置該條件變量而產(chǎn)生競(jìng)爭(zhēng)。pthread_cond_wait的函數(shù)原型為:
pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
pthread_cond_broadcast用于設(shè)置條件變量,即使得事件發(fā)生,這樣等待該事件的線程將不再阻塞:
pthread_cond_broadcast (pthread_cond_t *cond) ;
pthread_cond_signal則用于解除某一個(gè)等待線程的阻塞狀態(tài):
pthread_cond_signal (pthread_cond_t *cond) ;
pthread_cond_destroy 則用于釋放一個(gè)條件變量的資源。
在頭文件semaphore.h 中定義的信號(hào)量則完成了互斥體和條件變量的封裝,按照多線程程序設(shè)計(jì)中訪問(wèn)控制機(jī)制,控制對(duì)資源的同步訪問(wèn),提供程序設(shè)計(jì)人員更方便的調(diào)用接口。
sem_init(sem_t *sem, int pshared, unsigned int val);
這個(gè)函數(shù)初始化一個(gè)信號(hào)量sem 的值為val,參數(shù)pshared 是共享屬性控制,表明是否在進(jìn)程間共享。
sem_wait(sem_t *sem);
調(diào)用該函數(shù)時(shí),若sem為無(wú)狀態(tài),調(diào)用線程阻塞,等待信號(hào)量sem值增加(post )成為有信號(hào)狀態(tài);若sem為有狀態(tài),調(diào)用線程順序執(zhí)行,但信號(hào)量的值減一。
sem_post(sem_t *sem);
調(diào)用該函數(shù),信號(hào)量sem的值增加,可以從無(wú)信號(hào)狀態(tài)變?yōu)橛行盘?hào)狀態(tài)。