兩個線程分別計算從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