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

时间:2016-06-29 17:06:34

标签: c multithreading semaphore

我有两个线程thread1thread2分别包含例程func1func2。现在,在变量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);
  }

请解释这些变化。

1 个答案:

答案 0 :(得分:0)

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

volatile int cnt=1;

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