以前學操作系統的進程和線程管理時,經常聽到互斥加鎖解鎖之類的概念,但是幾乎很少在編程中用到,今天看《gnu/linux編程》的線程這章時,對c程序中如何給變量加鎖解鎖有了一個大致的瞭解,現記錄如下:
互斥其實是保證線程在關鍵區正常執行的變量,同一時刻只能由某一進程訪問,要建立一個關鍵區,首先得創建一個互斥變量,然後用特殊的符號爲其常量初始化。互斥變量聲明方法如下:
pthread_mutex_t test_mutex=PTHREAD_MUTEX_INITIALIZER;
互斥變量初始化有三種類型,具體的類型請google搜索。下面創建關鍵區:
pthread_mutex_t test_mutex=PTHREAD_MUTEXT_INITIALIZER;
。。。
/*進入關鍵區*/
assert(pthread_mutex_lock(&test_mutex)==0);
attr++; //要鎖定的變量,同一時刻只能某一線程訪問
assert(pthread_mutext_unlock(&test_mutex)==0);
/*退出關鍵區*/
關鍵區是同一時刻只允許某一線程執行的代碼段,關鍵區的存在是爲了保護共享資源,避免多重訪問的發生。
pthread_mutex_trylock()方法與pthread_mutex_lock()的區別是trylock如果不能成功加鎖可以幹其他的事情,而不是阻塞於加鎖關鍵區,而lock則是如不能加鎖關鍵區則阻塞於此,直到可以加鎖爲止。
互斥變量用完最後得銷燬,通過pthread_mutex_destroy()來銷燬即可。
一個完整實例如下:
#include <pthread.h>
#include <stdio.h>
#include <assert.h>
#define MAX 1000
#define MAX_THREAD 10
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
long counter = 0L;
void *mythread(void *args)
{
int i, ret;
for(i=0; i<MAX; i++)
{
ret = pthread_mutex_lock(&mymutex);
assert(ret == 0);
counter++;
ret = pthread_mutex_unlock(&mymutex);
assert(ret == 0);
}
}
int main()
{
int ret, i;
pthread_t threadId[MAX_THREAD];
for(i=0; i< MAX_THREAD; i++)
{
ret = pthread_create(&threadId[i],NULL,mythread,NULL);
if(ret != 0)
printf("Error creating thread %d\n",(int)threadId[i]);
}
for(i=0; i<MAX_THREAD; i++)
{
ret = pthread_join(threadId[i],NULL);
if(ret != 0)
printf("Error joining thread %d\n",(int)threadId[i]);
}
printf("The protected varible value is %ld\n",counter);
ret = pthread_mutex_destroy(&mymutex);
if(ret != 0)
printf("Couldn't destroy the mutex\n");
return 0;
}
參考:http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread.h.html