如何正确同步多线程与 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;
}

事实是,在执行时,同步实际上并没有发生,实际上,它确实发生了,仍然是“竞争条件”,使程序每次都打印其他内容。

我的问题是,如何停止这种竞争条件?我不知道我是否正确使用了这个 lockunlock 东西。

你需要在你的线程函数完成时释放互斥锁,同时在打印结束时添加\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;
}