【发布时间】:2022-01-05 19:11:20
【问题描述】:
我应该如何正确地将线程与互斥锁同步? 我正在尝试使用互斥锁进行简单的“同步”,它非常小,就像打印一个包含线程数的字符串。这里是sn-p:
#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 的东西。
【问题讨论】:
-
什么是“同步线程”?
-
如果您希望在启动之前(几乎)同时创建所有线程:从主线程锁定互斥锁,产生所有尝试锁定的其他线程,因此必须等待,当所有线程都有开始,从 main 解锁互斥锁,然后所有线程都可以竞争它。确保每个线程也正确解锁互斥锁。
-
同步 U 是什么意思可能会混淆互斥锁和条件变量。
-
在
use_res,我认为你需要一个pthread_mutex_unlock在底部
标签: c multithreading process