线程同步:指定2个线程按顺序执行(信号量)

如何让2个线程按照先后顺序执行n次呢?

如:线程A从用户输入得到值后存入全局变量num,此时线程B取走此值并且累加,总共执行n(5)次,完成后输出和

<很有意思的问题,在基本忘掉了所以线程同步方法(只记得mutex,和基本信号量原理)的情况下,考虑为什么2个mutex不能实现?>

我认为的原因:

mutex不能决定进程A还是进程B谁先执行(而信号量初始化的时候可以控制状态),对于临界区2者功能一样

2个信号量实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <me.h>

void* readin(void*);
void* addnum(void*);
int num = 0,temp;
sem_t a;
sem_t b;

int main()
{
pthread_t pthreada,pthreadb;

sem_init(&a,0,1);
sem_init(&b,0,0);
pthread_create(&pthreada,NULL,readin,NULL);
pthread_create(&pthreadb,NULL,addnum,NULL);

pthread_join(pthreada,NULL);
pthread_join(pthreadb,NULL);

sem_destroy(&a);
sem_destroy(&b);
printf("结果是:%d\n",num);
return 0;
}

//通过信号量使得按照顺序执行
void* readin(void *arg)
{
for (int i=0; i<5; i++)
{
sem_wait(&a);
printf("请输入值: \n");
scanf("%d",&temp);
sem_post(&b);
}
}

void* addnum(void* arg)
{
for (int i=0; i<5; i++)
{
sem_wait(&b);
num += temp;
sem_post(&a);
}
}

A临界区执行结束使得进程B解除阻塞,B临界区执行结束使得A解除阻塞


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!