2

我需要在 C 的每个线程中打印 2 条消息并同步它们。

一个线程打印 One,第二个线程打印 Two。

所以我的代码是这样的

void printOne(void* empty){
    while(1) printf("One ");  
}

void printTwo(void* empty){
    while(1) printf("Two\n");
}


int main(){

    pthread_t t_1,t_2;

    pthread_create(&t_1, NULL,(void *)&printOne,NULL);
    pthread_create(&t_2, NULL,(void *)&printTwo,NULL);

    pthread_join(t_1,NULL);
    pthread_join(t_2,NULL);

    exit(0);
}

问题是随机打印一和二,但并不总是按这个顺序。我想让它总是在一个之后打印。我对 join 命令有点困惑。

提前致谢!

4

2 回答 2

1

您在这里混淆了一些关于同步的基本概念。该pthread_join()功能不会保证您所想的同步。连接用于在线程执行完成return同步线程,即在线程内调用之后。这样,调用线程将等待指定线程完成其执行,这正是您的代码正在做的事情。主线程正在等待:

  1. 首先,t_1 结束
  2. 然后,t_2 结束

如果 t_2 在 t_1 之前结束,主线程仍然会被 t_1 阻塞,因为必须遵守这个顺序。当然,它们都不会在你的代码中完成它们的执行,因为它们都陷入了无限循环(while(1))。

您尝试实现的目标可以使用多种技术来完成。我建议您使用信号量(如果您想使用POSIX API)或互斥锁(已经在 pthread 库中实现)。

这是一个如何更改代码以获得同步的示例:

void printOne(void* empty){
    while(1)
    { 
      sem_wait(&s1); //wait for semaphore s1
      printf("One ");  
      sem_post(&s2); //signal semaphore s2
    }
}

void printTwo(void* empty){
    while(1)
    {
      sem_wait(&s2); //wait for semaphore s2
      printf("Two\n");
      sem_post(&s1); //signal semaphore s1
    }
}

sem_t s1, s2; //Declare the semaphores globally, so the threads can access them

int main(){

    pthread_t t_1,t_2;

    sem_init(&s1, 0, 1); //Initialize s1 with 1
    sem_init(&s2, 0, 0); //Initialize s2 with 0

    pthread_create(&t_1, NULL,(void *)&printOne,NULL);
    pthread_create(&t_2, NULL,(void *)&printTwo,NULL);

    pthread_join(t_1,NULL);
    pthread_join(t_2,NULL);

    exit(0);
}

这样,您的代码可以保证将一条又一条的消息打印到您的输出中:

一二
一二 ...
_
_

于 2013-10-21T15:58:41.130 回答
0

如果你希望它是同步的,为什么还要使用线程呢?只需将它们按顺序打印在main().

否则......我想你可以一个接一个地运行一个线程。pthread_join使程序在继续之前等待线程完成。

int main(){

    pthread_t t_1,t_2;

    pthread_create(&t_1, NULL,(void *)&printOne,NULL);
    pthread_join(t_1,NULL);

    pthread_create(&t_2, NULL,(void *)&printTwo,NULL);
    pthread_join(t_2,NULL);

    exit(0);
}

如果你想让线程真正完成,你将不得不在你的printOne和函数中创建一个中断条件,但是......printTwo

于 2013-10-21T15:50:25.800 回答