簡體   English   中英

在 C 中終止線程

[英]Terminating thread in C

我正在學習如何在 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終止后永遠等待條件變量發出信號。

除此之外,條件等待也會受到虛假喚醒的影響,您必須在喚醒后測試謂詞(如果它確實為真),如果不為真,則返回等待。 大多數 UNIX 系統會解除這個 cond 等待調用的阻塞,以防信號被傳遞到進程並且他們不會重新啟動調用,你必須在你的代碼中處理它。

更多關於這里

//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(!(predicate == true)) pthread_cond_wait(...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM