gpt4 book ai didi

c - C中如何根据奇数或偶数改变两个线程的执行顺序?

转载 作者:太空宇宙 更新时间:2023-11-04 04:29:27 25 4
gpt4 key购买 nike

我有两个线程 thread1,thread2 分别有例程 func1,func2 。现在,基于一个变量 cnt 我想改变这两个线程的执行顺序。也就是说,如果 cnt 是偶数,则执行 func1 然后执行 func2 否则,如果 cnt 是奇数,则执行 func2 然后 func1。当 cnt 从 1 到 100 时,我必须这样做。

我只能通过使用信号量来实现。我试图使用以下代码解决它。但是代码还不够好。

#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>

int cnt=1;
sem_t e_lock,o_lock;

void* func1()
{
while(cnt<=100)
{
if(cnt%2==0) //if even exec then p1
{
printf("value of count: %d\n",cnt);
sem_wait(&e_lock);
printf("even execution, process 1 first\n");
}else
{
sem_post(&o_lock);
printf("odd execution, process 1 second\n");
cnt++;
}
}
}

void* func2()
{
while(cnt<=100)
{
if(cnt%2!=0) //if odd exec then p1
{
printf("value of count: %d\n",cnt);
sem_wait(&o_lock);
printf("odd execution, process 2 first\n");
}else
{
sem_post(&e_lock);
printf("even execution, process 2 second\n");
cnt++;
}
}
}
void main()
{

pthread_t thread1,thread2;

pthread_create(&thread1,NULL,func1,NULL);
pthread_create(&thread2,NULL,func2,NULL);

pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
}

请解释变化。

最佳答案

您忘记将共享变量 cnt 声明为 volatile:

volatile int cnt=1;

如果没有 volatile,编译器可以生成变量值保存在寄存器中的代码,并且可能看不到其他线程的更改。

关于c - C中如何根据奇数或偶数改变两个线程的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106018/

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