[英]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.