gpt4 book ai didi

c - 带信号量的 N 个线程的屏障

转载 作者:行者123 更新时间:2023-11-30 17:54:36 25 4
gpt4 key购买 nike

我编写了以下简短的应用程序来解决障碍问题。此应用程序应保证运行相同线程方法的三个相同线程都将在公共(public)代码部分“相遇”。我运行了一下,看起来没问题。我的问题是:

1) 正确吗?

2) 是否有一种首选且有效的方法来实现 N 个线程?

这是代码:

static sem_t t_1_sem;

static sem_t t_2_sem;

static sem_t t_3_sem;



struct my_thread_info {
int num;
};

void *thread(void *vargp)

{

struct my_thread_info *info = (struct my_thread_info*)vargp;
static int counter=0;
counter++;

if (info->num == 1) {
printf("info->num=%d\n", info->num);
if (counter<3)
sem_wait(&t_1_sem); // down
else {
sem_post(&t_2_sem); // up
sem_post(&t_3_sem); // up
}

} else
if (info->num == 2) {
printf("info->num=%d\n", info->num);
if (counter<3)
sem_wait(&t_2_sem);
else {
printf("info->num=%d\n", info->num);
sem_post(&t_1_sem);
sem_post(&t_3_sem); //up
}
}
else
if (info->num == 3) {
printf("info->num=%d\n", info->num);
if (counter<3)
sem_wait(&t_3_sem);
else {
sem_post(&t_1_sem);
sem_post(&t_2_sem); //up
}
}
printf("meeting occured!\n");

}

int main()
{
pthread_t tid0, tid1, tid2;

struct my_thread_info info1, info2, info3;
info1.num = 1;

sem_init(&t_1_sem, 0, 0);
sem_init(&t_2_sem, 0, 0);
sem_init(&t_3_sem, 0, 0);

pthread_create(&tid0, NULL, thread, &info1);
info2.num = 2;

pthread_create(&tid1, NULL, thread, &info2);

info3.num = 3;
pthread_create(&tid2, NULL, thread, &info3);


pthread_join(tid0, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pause();
return 0;

}

问候凯文

最佳答案

首先,您的 counter 变量不 protected - 在执行 counter++ 时,您可能存在竞争条件。使用互斥锁;

至于执行 N 个线程 - 使用线程/信号量数组在我看来是可以接受的,我有利用该设计的代码并且运行良好。

关于c - 带信号量的 N 个线程的屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com