linux C線程雜記

以前學操作系統的進程和線程管理時,經常聽到互斥加鎖解鎖之類的概念,但是幾乎很少在編程中用到,今天看《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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章