【问题标题】:Terminating thread in C在 C 中终止线程
【发布时间】:2020-03-08 20:29:36
【问题描述】:

我正在学习如何在 C 中使用线程,我创建了一个程序,它调用两个线程并同时打印一些东西。

这是我的代码:

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

pthread_mutex_t count_mutex     = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  condition_var   = PTHREAD_COND_INITIALIZER;

void *functionCount1();
void *functionCount2();
int  count = 0;

#define COUNT_DONE  10

int main()
{
   pthread_t thread1, thread2;

   pthread_create( &thread1, NULL, &functionCount1, &count);
   pthread_create( &thread2, NULL, &functionCount2, &count);

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

   printf("Final count: %d\n", count);

   exit(0);
}

//Print count when count is even
void *functionCount1()
{

        for(;;)
        {
                pthread_mutex_lock( &count_mutex );


                pthread_cond_wait( &condition_var, &count_mutex );
                        count++;
                        printf("Counter value functionEven: %d\n",count);

                pthread_mutex_unlock( &count_mutex );
        }
}

//Print count when count is odd
void *functionCount2(void *arg)
{
        for(;;)
        {
                pthread_mutex_lock( &count_mutex );
                        if(count%2 == 0)
                        {
                        pthread_cond_signal( &condition_var );
                        }
                        if(count % 2 != 0)
                        {
                        count++;
                        printf("Counter value functionOdd: %d\n",count);
                        }
                        pthread_mutex_unlock( &count_mutex );
                        if(count >= COUNT_DONE) return(NULL);
        }
}

这是我得到的输出:

输出正确,但线程似乎仍在后台运行。如何解决该问题并正确终止线程?

【问题讨论】:

  • functionCount1 函数没有退出。它将永远循环。在您的情况下,因为 functionCount2 完成了执行,所以卡在了条件变量上。在functionCount1 中将for(;;) 替换为while (count &lt; COUNT_DONE)
  • @TarekDakhran 感谢您的回复,我尝试将 for 循环替换为 while 循环,但仍然无法正常工作。
  • 尝试while (count + 1&lt; COUNT_DONE),似乎边缘案例逻辑不正确。 while (count &lt; COUNT_DONE) 也可以,但您必须再发出一次条件变量信号。
  • 现在是正确的感谢您的帮助
  • 我已经编辑了上面的评论。请重读。

标签: c linux operating-system


【解决方案1】:

functionCount1 没有条件终止循环。它将在functionCount2 永远终止后等待条件变量发出信号。

【讨论】:

  • 我用while循环为functionCount1添加了条件,但它仍然没有终止。
  • 仍然,functionCount2 终止,pthread_cond_wait 将永远等待。考虑使用pthread_cond_timedwait。你确定你需要条件变量吗?您已经使用互斥锁进行锁定。
【解决方案2】:

除此之外,条件等待也会受到虚假唤醒的影响,您必须在唤醒后测试谓词(如果它确实为真),如果不为真则返回等待。大多数 UNIX 系统会解除阻塞这个 cond wait 调用,以防信号被传递到进程并且他们不会重新启动调用,你必须在你的代码中处理它。

更多关于here

//Print count when count is even
 void *functionCount1()
 {

     for (;;) {
         pthread_mutex_lock(&count_mutex);

         pthread_cond_wait(&condition_var, &count_mutex);
         if(count >= COUNT_DONE)
             return NULL;
         count++;
         printf("Counter value functionEven: %d\n", count);

         pthread_mutex_unlock(&count_mutex);
     }
 }

 //Print count when count is odd
 void *functionCount2(void *arg)
 {
     for (;;) {
         pthread_mutex_lock(&count_mutex);
         if (count % 2 == 0) {
             pthread_cond_signal(&condition_var);
         }
         if (count % 2 != 0) {
             count++;
             printf("Counter value functionOdd: %d\n", count);
         }
         if (count >= COUNT_DONE) {
             pthread_cond_signal(&condition_var);
             pthread_mutex_unlock(&count_mutex);
             return NULL;
         }
         pthread_mutex_unlock(&count_mutex);
     }
 }

代码可以更好地表达,但希望传达您需要的信息。这还需要添加我没有包含的谓词的测试。

while(!(谓词 == true)) pthread_cond_wait(...);

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多