2012-02-29 35 views
2

我有2個主題。 我的目標是,第一個終止他自己的執行,必須停止另一個線程。 這可能嗎?一個線程停止另一個在C中

我有這樣的代碼:

#include <stdio.h> 
#include <pthread.h> 
#include <sys/types.h> 

void* start1(void* arg) 
{ 
    printf("I'm just born 1\n"); 
    int i = 0; 
    for (i = 0;i < 100;i++) 
    { 
    printf("Thread 1\n"); 
    } 
    printf("I'm dead 1\n"); 
    pthread_exit(0); 
} 

void* start2(void* arg) 
{ 
    printf("I'm just born 2\n"); 
    int i = 0; 
    for (i = 0;i < 1000;i++) 
    { 
    printf("Thread 2\n"); 
    } 
    printf("I'm dead 2\n"); 
    pthread_exit(0); 
} 

void* function() 
{ 
    int k = 0; 
    int i = 0; 
    for (i = 0;i < 50;i++) 
    { 
    k++; 
    printf("I'm an useless function\n"); 
    } 
} 

int main() 
{ 
    pthread_t t, tt; 
    int status; 
    if (pthread_create(&t, NULL, start1, NULL) != 0) 
    { 
    printf("Error creating a new thread 1\n"); 
    exit(1); 
    } 
    if (pthread_create(&tt, NULL, start2, NULL) != 0) 
    { 
    printf("Error creating a new thread 2\n"); 
    exit(1); 
    } 
    function(); 
    pthread_join(t, NULL); 
    pthread_join(tt, NULL); 
    return 0; 
} 

例如,第一線程必須停止第二個。 怎麼可能做到這一點?

回答

10

通常強制一個線程終止是不好的做法。終止另一個線程的乾淨方式是通過設置一個標誌(對兩個線程都可見)來告訴線程自行終止(通過立即返回/退出)。

0

這聽起來很複雜(壞)的設計。通常你會有一個主(控制器),它會有孩子。

如果你必須採取這種方法,我會讓第一個線程產生第二個,然後第二個thrid(所以它「擁有」該線程)。

最後,如果您必須這樣做,您可以通過它的void *參數將線程傳遞給第一個worker。

此外,您不需要顯式退出線程,只需讓它'跑掉'然後加入它。

0

作爲參數傳遞給另一個線程的2個線程。在第一個完成他的工作時請撥打pthread_kill(other_thread_id, SIGKILL)。我假設你知道你在做什麼(你已經被警告過這是不好的做法)。

+0

在舊的撥號連接上,經常出現連接卡住的情況,唯一可能的解決方法是終止應用程序。如果你有可能關閉連接(即使是從其他線程),也不需要終止程序本身。只有當它變成一種習慣時,這纔是不好的。 – SChepurin 2012-02-29 13:01:16

0

查看方法pthread_cancel()取消(結束)一個線程。

相關問題