簡體   English   中英

pthreads / C:使用標志優雅地終止其他線程

[英]pthreads / C : using a flag to gracefully terminate other threads

使用僅由一個線程寫入並且僅由其他線程讀取的標志來優雅地終止線程是否安全(並且是一種好習慣)?

考慮以下代碼:

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

static int run;
static pthread_t t1, t2;

static void *threadFunc(void *context)
{
    puts("thread starting");

    init();

    while(run)
    {
        do_stuff();
    }

    clean_up();

    puts("thread exiting");

    return NULL;
}

int main(int argc, char **argv)
{
    puts("program starting");
    run = 1;

    pthread_create(&t1, NULL, threadFunc, NULL);
    pthread_create(&t2, NULL, threadFunc, NULL);

    do_some_stuff();

    run = 0;

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    puts("program exiting");
    return 0;
}

變量“run”用於告訴線程 t1 和 t2 終止。 那很好還是我應該使用互斥體/memory 屏障? 為什么? 我不在乎在線程退出之前是否需要更多的循環周期,但我不希望它們永遠運行。 我不想使用 pthread_cancel() 因為我希望線程僅在完成主循環的一個周期后才退出。

謝謝

最安全的方法是使run原子化。 現代 C 確實支持原子類型。

您需要一個互斥鎖來保護共享變量,因為這就是 pthreads 標准所說的。 您不能假設它失敗的最壞方式是“在線程退出之前再多循環幾個循環”。

它可能會崩潰。 它可能無法停止。 任何事情都有可能發生。

如果您的平台支持某種原子類型或原子操作,您可以使用它。

有些人認為使用volatile適用於“關閉”標志。 請注意,這是非常特定於平台的,可能適合您,也可能不適合您。 我不認為它在有更好選擇的平台上是可以接受的,也就是說,在所有現代平台上。

暫無
暫無

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

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