如何创建2个线程并交替打印线程ID和从1到20的数字?

时间:2017-10-06 11:59:49

标签: c multithreading loops pthreads

代码

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

pthread_t tid[2];
void* fun(void* ptr) 
{
    int i = *((int *) ptr);
    int self_id;
    self_id=pthread_self();
    printf("Thread %u  ",self_id);
    printf("printing %d \n", i);
    pthread_exit(NULL);
    return NULL;
}

int main() 
{
    int i=0,j=1,k;
    for(j=1;j<21;)
    {
        for(i=0;i<2;i++)
        {   
            pthread_create(&tid[i],NULL,fun,&j);
            sleep(1);
            j++;
        }

    }
    for(j=1;j<21;)
    {
        for(i=0;i<2;i++)
        {
            pthread_join(tid[i],NULL);
            j++;
        }
    }
        pthread_exit(NULL);
}

所以如果2个线程是t1和t2并且它们的线程id是1023和1024,那么输出应该是

            Thread 1023 printing 1
            Thread 1024 printing 2
            Thread 1023 printing 3
            Thread 1024 printing 4

            and so on till printing 20

但我的代码输出是

            Thread 1023 printing 1
            Thread 1024 printing 2
            Thread 1025 printing 3
            Thread 1026 printing 4

            and so on till printing 20

线程ID不是交替的。如何使线程id交替。

2 个答案:

答案 0 :(得分:2)

下面:

for(j=1;j<21;)
{
  for(i=0;i<2;i++)
  {   
    pthread_create(&tid[i],NULL,fun,&j);
    ...

你创建了20 * 2个线程,这解释了你见证的线程数。

为了创建两个线程,您应该只创建两个线程,例如:

for(i=0;i<2;i++)
{   
  pthread_create(&tid[i],NULL,fun,&j);
  ...

即没有外环。此外,您必须修改fun()以打印10次(因此2 * 10 = 20)。现在最棘手的部分是让第一个线程的fun()与第二个线程同步,如果你真的需要定义输出消息的顺序。但是,这会导致并行化。

PS:#include <unistd.h>需要sleep()

答案 1 :(得分:0)

从我可以理解的问题来看,你需要两个线程,交替打印1到20个。

首先,正如gsamaras指出的那样,你正在产生40个线程,因为外部循环迭代20次,而内部循环迭代2次。因此,你必须按照gsamaras的指示生成2个线程。

除此之外,如果要替换打印,则必须进行一些同步,否则在文件中打印的顺序(本例中为stdout)是未定义的。我建议使用条件变量在这种情况下在线程之间交替以实现您的目标。

如果您对POSIX线程或线程相对较新,我建议您仔细阅读:https://github.com/expressjs/express/issues/2495