【问题标题】:how to terminate infinite loop (threading)如何终止无限循环(线程)
【发布时间】:2013-04-02 23:23:46
【问题描述】:

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

感谢您的帮助。

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;
}

【问题讨论】:

  • "int mls = 0.5"? 0.5 不是整数。

标签: c multithreading pthreads


【解决方案1】:

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

由于pthread_join() 阻塞了调用线程,自然的结论是启动第三个线程(线程“Dots”)来按要求绘制点。

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

【讨论】:

    【解决方案2】:
     while(pthread_kill(thread1, 0) == 0 &&  pthread_kill(thread2, 0) == 0)
     {
          printf(".");
          fflush(stdout);
          sleep(mls); 
     }
    

    int pthread_kill(pthread_t thread, int sig);

    你可以使用这个函数来获取线程的状态,如果sig参数是0,那么没有信号被发送,但是仍然执行错误检查(例如你可以使用这个来检查线程是否'alive')。

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

    【讨论】:

    • 这适用于这种特殊情况。如果在同一进程中创建、运行、终止更多线程独立地解决此问题,它可能不再工作,因为 pthread-id 被回收。因此,thread1和/或thread2的值可能已经很好地在两个while-test 之间被其中一个或两个独立运行的任务重用了。更安全的解决方案是为每个线程使用条件/互斥锁,以指示其终止作为最后一个任务,然后再关闭。
    【解决方案3】:

    尝试使用 pthread_exit,如您在 terminate c thread 中所见。

    【讨论】:

    • 如果我理解正确,函数pthread_exit退出线程的处理,但是如果thread2已经结束,我需要检查while循环然后打破循环。
    • pthread_exit() 在任何情况下都无助于解决 OP 的问题。
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2014-01-05
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多