執行緒間同步機制
互斥鎖通訊機制
互斥以排他方式防止共享資料被併發修改。
(1)在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,
並立即占有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。
(2)只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作無效。
初始化鎖
靜態初始化互斥鎖
pthread_mutex_t mutex = pthread_mutex_initializer;
動態初始化互斥鎖
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
銷毀互斥鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);
申請互斥鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
以非阻塞方式申請互斥鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);
釋放互斥鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
程式示例如下
程式共兩個執行緒,乙個執行緒負責從輸入裝置讀取資料,然後存在在全域性變數中,
另乙個執行緒負責將全域性變數輸出到輸出裝置中。
#include
#include
#include
#include
#include
#include
void *tfun(void *arg);
pthread_mutex_t gmutex;
#define buf 1024
char gdata[buf];
int gtime = 0;
int main(int argc,char*argv)
res = pthread_create(&th1,0,tfun,0);
if(res != 0)
pthread_mutex_lock(&gmutex);
printf("input some text,enter 'exit' to finished\n");
while(!gtime)
else
break;
}
}pthread_mutex_unlock(&gmutex);
printf("\n waiting for thread to finish ...\n");
res = pthread_join(th1,&thret);
if(res != 0)
pthread_mutex_destroy(&gmutex);
exit(0);
}void *tfun(void * arg)
}gtime = 1;
gdata[0] = '\0';
pthread_mutex_unlock(&gmutex);
pthread_exit(0);
}
Linux多執行緒程式設計 執行緒互斥鎖
通過下面的練習加深對執行緒的概念的理解,同時明確執行緒的控制。從而進一步了解執行緒的互斥,並學會利用pthread庫。定義乙個用於互斥的互斥鎖 和乙個主函式和兩個子執行緒都能訪問的共享變數,乙個主函式和兩個用來建立子執行緒的子函式 在主函式中定義兩個子執行緒id的變數,初始化互斥鎖,建立對應函式的子...
linux執行緒互斥鎖
使用執行緒編寫程式需要技巧,而多執行緒的程式中的bug非常難以跟蹤 除錯,因為這些bug經常是難以再現的。競爭條件 當乙個執行緒訪問乙個資料結構的時候,另乙個執行緒也訪問同乙個資料結構,這時就出現了競爭條件 兩個執行緒 也可能是多個 競爭對同乙個資源的訪問。當其中乙個執行緒處理到一部分的時候,另外的...
linux 執行緒互斥鎖
一,鎖的建立 鎖可以被動態或靜態建立,可以用巨集pthread mutex initializer來靜態的初始化鎖,採用這種方式比較容易理解,互斥鎖是pthread mutex t的結構體,而這個巨集是乙個結構常量,如下可以完成靜態的初始化鎖 pthread mutex t mutex pthrea...