如何正确同步多线程与 c 中的互斥锁?
How to properly sync multithreading with mutex in c?
我应该如何正确同步线程与互斥量?
我正在尝试使用互斥锁进行简单的“同步”,这非常小,比如只打印一个包含线程号的字符串。此处摘录:
#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
东西。
你需要在你的线程函数完成时释放互斥锁,同时在打印结束时添加\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;
}
我应该如何正确同步线程与互斥量? 我正在尝试使用互斥锁进行简单的“同步”,这非常小,比如只打印一个包含线程号的字符串。此处摘录:
#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
东西。
你需要在你的线程函数完成时释放互斥锁,同时在打印结束时添加\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;
}