如何在c中正确同步多线程与互斥锁?

Posted

技术标签:

【中文标题】如何在c中正确同步多线程与互斥锁?【英文标题】:How to properly sync multithreading with mutex in c? 【发布时间】: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;

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

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

【问题讨论】:

什么是“同步线程”? 如果您希望在启动之前(几乎)同时创建所有线程:从主线程锁定互斥锁,产生所有尝试锁定的其他线程,因此必须等待,当所有线程都有开始,从 main 解锁互斥锁,然后所有线程都可以竞争它。确保每个线程也正确解锁互斥锁。 同步 U 是什么意思可能会混淆互斥锁和条件变量。 use_res,我认为你需要一个pthread_mutex_unlock在底部 【参考方案1】:

你需要在你的线程函数完成后释放互斥体,还要在打印的最后加上\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;

【讨论】:

以上是关于如何在c中正确同步多线程与互斥锁?的主要内容,如果未能解决你的问题,请参考以下文章

线程同步

[C++11 多线程同步] --- 互斥锁

[C++11 多线程同步] --- 互斥锁

并发与多线程——同步与互斥

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步异步阻塞非阻塞

高并发基石多线程守护线程线程安全线程同步互斥锁