我應該如何正確地將執行緒與互斥鎖同步?我正在嘗試使用互斥鎖進行簡單的“同步”,非常小的東西,比如只列印一個包含執行緒編號的字串。片段在這里:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define MAX_RESOURCE 5
#define NO_THREADS 5
int res_available = MAX_RESOURCE;
pthread_mutex_t mtx;
struct count { int no;};
void *
use_res(void *v) {
pthread_mutex_lock(&mtx);
struct count *p = (struct count *) v;
printf("--thread no %d :" p->nr);
return NULL;
}
int main(){
pthread_t thr[NO_THREADS];
pthread_mutex_init(&mtx, NULL);
for(int i=0; i<N0_THREADS; i ){
struct count *c = malloc(sizeof(struct count));
c->nr = i;
pthread_create(thr[i], NULL, use_res, c))
}
for(int i=0; i<NO_THREADS; i ) {
pthread_join(thr[i], NULL);
}
return 0;
}
事實是,當執行時,同步實際上并沒有發生,實際上,它發生的仍然是“競爭條件”,使程式每次都列印其他內容。
我的問題是,我如何停止這種競爭條件?我不知道我是不是正確使用這個lock和unlock事。
uj5u.com熱心網友回復:
您需要在執行緒函式完成時釋放互斥鎖,并\n在列印結束時添加,因為 stdout 將緩沖此文本:
void *
use_res(void *v) {
pthread_mutex_lock(&mtx);
struct count *p = (struct count *) v;
printf("--thread no %d :\n" p->no);
pthread_mutex_unlock(&mtx);
return NULL;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368918.html
上一篇:輸入超過1個字符的輸入時,使用scanf的Cwhile回圈會列印兩次
下一篇:實作和定義有什么區別?
