我有两个线程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);
}
请解释这些变化。
答案 0 :(得分:0)
您忘了将共享变量cnt
声明为volatile
:
volatile int cnt=1;
如果没有volatile
,则允许编译器生成代码,其中变量值保存在寄存器中,并且可能看不到其他线程的更改。