Linux 線程鎖

兩個線程分別計算從1加到100,並且把結果都存儲在count變量中。因此爲了保證數據的線程安全,在對count值進行寫操作時要加鎖。加鎖可以通過

pthread_mutex_lock()

pthread_mutex_unlock()

兩個函數來實現加鎖與釋放鎖。

但是實際應用中爲了代碼簡潔以及防止程序員漏掉unlock,所以通過一個線程鎖對象來實現線程鎖的自釋放。

ThreadLock構造函數執行時對外部的鎖對象加鎖,對象生命週期結束後執行析構函數,釋放外部鎖對象。


class ThreadLock
{
private:
pthread_mutex_t* mutexPtr;
public:
explicit inline ThreadLock(pthread_mutex_t *pm):mutexPtr(pm)//explicit 抑制隱式轉換,inline加入符號表提高函數調用效率
{
//printf("lock of threadid:%d\n",pthread_self());//放在這裏,打印出來的信息不準
pthread_mutex_lock(mutexPtr);
printf("lock of threadid:%d\n",pthread_self());
}
inline ~ThreadLock()
{
printf("unlock of threadid:%d\n",pthread_self());
pthread_mutex_unlock(mutexPtr);
}
};



/*************************************************************************

    > File Name: threadsync.c
    > Author: chenhui
    > Mail: ********* 
    > Created Time: 2016年02月29日 21:53:40
 ************************************************************************/

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include "threadLock.h"

int count=0;

pthread_mutex_t count_mutex=PTHREAD_MUTEX_INITIALIZER;
void *addNum(void*)//.c文件時沒加void*,可以編譯運行。.cpp文件時編譯不過(pthread_create(,,addNum,))提示類型轉換無效
{
int i=1;
for(;i<=100;i++)
{
//pthread_mutex_lock(&count_mutex);//線程鎖


ThreadLock lock(&count_mutex);
count+=i;
printf("count:%d,of thread id:%d\n",count,pthread_self());


//pthread_mutex_unlock(&count_mutex);
}
}


int main()
{
pthread_t p1,p2;
pthread_create(&p1,NULL,addNum,NULL);
pthread_create(&p2,NULL,addNum,NULL);


pthread_join(p1,NULL);
pthread_join(p2,NULL);


return 0;
}
/*
 * pthread_join使一個線程等待另一個線程結束。 代碼中如果沒有pthread_join主線程會很快結束從而使整個進程結束,
 * 從而使創建的線程沒有機會開始執行就結束。

 * */

threadLock.h

#ifndef THREAD_LOCK
#define THREAD_LOCK


#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>


class ThreadLock
{
private:
pthread_mutex_t* mutexPtr;
public:
explicit inline ThreadLock(pthread_mutex_t *pm):mutexPtr(pm)//explicit 抑制隱式轉換,inline加入符號表提高函數調用效率
{
//printf("lock of threadid:%d\n",pthread_self());//放在這裏,打印出來的信息不準
pthread_mutex_lock(mutexPtr);
printf("lock of threadid:%d\n",pthread_self());
}
inline ~ThreadLock()
{
printf("unlock of threadid:%d\n",pthread_self());
pthread_mutex_unlock(mutexPtr);
}
};
//ThreadLock lock=&mutex;//如果不加explicit,可以這樣寫。


#endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章