在2个线程之间交替

时间:2015-10-29 19:40:20

标签: c multithreading

我想制作一个程序,用2个函数写入1到100之间的奇数和偶数,第一个函数打印前5个奇数,第二个函数打印前5个偶数,然后再返回第一个功能打印第二个5个奇数,依此类推。 在这个程序中,我想只在2个线程之间交替,但我无法找到解决方案。这是我的代码,在这段代码中我创建了40 threads.Does任何人都知道如何在2个线程之间交替并找到相同的输出。

#include<stdio.h>
#include<pthread.h>
pthread_t tid[40];
int pair=2;
int impair=1 ;
pthread_mutex_t lock;

void* genpair(void *arg)
{
    pthread_mutex_lock(&lock);
    int i = 0;
    for (i=0 ; i<5 ; i++,pair+=2)
    {
        printf("%d ",pair) ;
    }
printf("  ");    
pthread_mutex_unlock(&lock);

    return NULL;
}
void* genimpair(void *arg)
{
    pthread_mutex_lock(&lock);
    int i = 0;
    for (i=0 ; i<5 ; i++,impair+=2)
    {
         printf("%d ",impair) ;
    }
printf("  ");    
pthread_mutex_unlock(&lock);

    return NULL;
}

int main(void)
{
    int i = 0;
    int j=0 ;
    int err;

    if (pthread_mutex_init(&lock, NULL) != 0)
    {
        printf("\n mutex init failed\n");
        return 1;
    }

    for(j=0 ; j<20 ; j+=2)  
    {
        pthread_create(&(tid[j]), NULL, &genpair, NULL);
        pthread_create(&(tid[j+1]), NULL, &genimpair, NULL);
        pthread_join(tid[j], NULL);
        pthread_join(tid[j+1], NULL);           
    }

    pthread_mutex_destroy(&lock);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您无法确保哪个线程只能通过互斥锁传递给另一个线程。互斥锁只是为了确保只有一个线程能够运行关键代码。您可以使用与互斥锁相关联的条件变量使它们一个接一个地传递,如下面的伪代码所示:

// thread1
do {
  lock(m);
  while (turn==0) cond_wait(m); // release the key if not my turn, retry until my turn
  do my job;
  turn = 0;                     // give hand to the other
  cond_broadcast(m);            // awake threads waiting for key (blocked in lock or cond_wait)
  unlock(m);                    // release the lock
} while ();

// thread2
do {
  lock(m);
  while (turn==1) cond_wait(m);
  do my job;
  turn = 1;
  cond_broadcast(m);
  unlock(m);
} while();

你也可以使用两个信号量来完成同样的工作......

答案 1 :(得分:-2)

您必须使用2种不同的互斥锁,而您的代码必须是这样的

//Thread pair
{
  pthread_mutex_lock(&pairLock)
  //Do pair job
  pthread_mutex_unlock(&impairLock)
}

//Threa impair
{
  pthread_mutex_lock(&impairLock)
  //Do impair job
  pthread_mutex_unlock(&pairLock)
}

起始线程的互斥锁必须从1(解锁)开始,另一个在0(锁定)

编辑:对所有线程使用相同的互斥锁使得只有一个线程可以执行它的工作但不强制任何顺序或交替(取决于系统调度程序)。在你的情况下genimpair可以先执行,如果调度程序这样说,但它不会被genpair中断,在下一个循环中它可能是相同的顺序