2

我对退出 while 循环有疑问。我正在编写代码,其中创建了两个线程,它们打印字符串,而 main() 部分必须每 500 毫秒打印一次点 (".")。你能帮我在第二个线程终止后如何退出while循环,以便在输出中得到类似的东西:...Hello...World....THE END

感谢您的帮助。

int main() 
{
    int mls = 0.5 ; 
    pthread_t thread1;
    pthread_t thread2;

    struktura param1 = { "Hello", 2};
    struktura param2 = { "World", 4};

    pthread_create( &thread1, NULL, thread, &param1);
    pthread_create( &thread2, NULL, thread, &param2);

    while(1)
    {
        printf(".");
        fflush(stdout);
        sleep(mls); 
    }

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("THE END\n");
    return 0;
}
4

3 回答 3

2

在考虑了这个问题之后,我得出的结论是,如果主要用例确实要确保两个线程(线程“Hello”和线程“World”)都消失了,那么就没有其他方法可以同时使用这两个线程pthread_join()

由于pthread_join()阻塞调用线程,自然的结论是启动第三个线程(线程“Dots”)以根据请求绘制点。

然后,第三个线程(线程“Dots”)由main()-thread 发出信号,等待其他两个线程(线程“Hello”和线程“World”)在它从两个阻塞调用返回后完成pthread_join()。如果这样做了,第三个线程(线程“Dots”)就完成了。后者可以独立运行,因为没有人在等待它终止。

于 2013-04-03T09:10:26.617 回答
1
 while(pthread_kill(thread1, 0) == 0 &&  pthread_kill(thread2, 0) == 0)
 {
      printf(".");
      fflush(stdout);
      sleep(mls); 
 }

int pthread_kill(pthread_t 线程,int sig);

您可以使用此函数检索线程的状态,如果 sig 参数为 0,则不发送任何信号,但仍会执行错误检查(例如,您可以使用此函数检查线程是否处于“活动状态”)。

它可以返回 0 或错误代码(ESRCH - 找不到具有 ID 线程的线程,并且在这种情况下多一个不重要),如果返回值为 0,则线程为“活动”,如果返回值为错误找不到比指定线程的代码(ESRCH),例如。它“死了”。

于 2013-04-03T00:25:51.660 回答
-1

尝试使用 pthread_exit,正如您在terminate c thread中看到的那样。

于 2013-04-02T23:26:09.987 回答