#include<iostream> #include<pthread.h> using namespace std; pthread_t pt[2]; pthread_mutex_t mtx; int num = 100; void *func_thread(void* input) { while(1) { pthread_mutex_lock(&mtx); if(num <= 0 || num >= 200) pthread_exit(0); cout<<"this is thread:"<<(char*)input <<endl; if(0 == strcmp((char*)input,"thread1")) { num++; } else { num--; } cout<<"now num="<<num<<endl; pthread_mutex_unlock(&mtx); sleep(1); } } int main() { pthread_create(&pt[0],NULL,func_thread,(void*)"thread1"); pthread_create(&pt[1],NULL,func_thread,(void*)"thread2"); pthread_join(pt[0],NULL); pthread_join(pt[1],NULL); return 0; }加入sleep的目的是防止資源一直被“thread1”占用
編譯的時候要包含pthread庫:
g++ thread_test.cpp -lpthread -o a.out
關於互斥鎖我們主要可以用到下面3個函數(引自百度百科):
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被占據時返回EBUSY而不是掛起等待。
另外互斥鎖還有動態和靜態創建的區別,我這裡采用的是靜態創建,動態創建需要用到:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
int pthread_mutex_destroy(pthread_mutex_t *mutex)
其中pthread_mutexattr_t表示的是互斥鎖的屬性(引自百度百科):
互斥鎖的屬性在創建鎖的時候指定,在LinuxThreads實現中僅有一個鎖類型屬性,不同的鎖類型在試圖對一個已經被鎖定的互斥鎖加鎖時表現不同。
當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:
* PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖以後,其余請求鎖的線程將形成一個等待隊列,並在解鎖後按優先級獲得鎖。這種鎖策略保證了資源
分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,並通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。
* PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當不允許多次加鎖時不會
出現最簡單情況下的死鎖。
* PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動作最簡單的鎖類型,僅等待解鎖後重新競爭。