#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,適應鎖,動作最簡單的鎖類型,僅等待解鎖後重新競爭。