簡體   English   中英

如何在沒有 pthread_join() 的情況下使 pthreads 並發工作

[英]How to make pthreads work concurrent without pthread_join()

我正在制作一個程序,其中有多個線程同時工作。 在弄亂了代碼一段時間后,我遇到了一個問題,我將向線程發送一個字符串 ( char * ) 以進行進一步的操作,但不知何故該字符串根本沒有發送。

后來,我寫了一個非常簡單的代碼,我只是將一個字符串發送到一個線程,然后 function 將它打印到控制台。 我發現如果不使用pthread_join() ,它根本不起作用。 我不知道為什么,因為我知道每當調用pthread_join()時,它都會阻塞所有其他線程並等待該線程完成。

這是一個簡單的程序:

void* prisntstr(void* string);

int main(int argc, char *argv[])
{
    char* string = "Hello!";

    pthread_t thread;

    pthread_create(&thread, NULL, prisntstr, (void*)string);

    pthread_join(thread, NULL);

}

void* prisntstr(void* string)
{
    char* str = (char*)string;

    printf("%s\n", str);
}

有誰知道我如何在不使用pthread_join()的情況下做到這一點?

如果您刪除pthread_join ,您的程序的問題是main正在返回,從而導致程序退出而沒有做任何與其他線程同步並確定它是否實際完成的事情。 main返回時,就像您調用了exit一樣,整個過程終止。

除了pthread_join之外,還有很多方法可以讓main等待其他操作完成。 您可以等待其他線程發布的信號量,您可以循環檢查其他線程設置的數據的條件變量等。

或者,您可以main調用pthread_exit以終止初始線程。 然后在您調用exit或每個線程退出之前,該進程不會退出。

調用pthread_join()的線程只是等待另一個線程完成。 請注意:

如果該線程已經終止,則pthread_join()立即返回

這是最優雅的方式,其他方式更復雜,並且涉及 IPC 技術:

  • 調用線程可以等待輔助線程放置的互斥體/信號量
  • 調用線程可以等待輔助線程發送的信號
  • ... 等等

所以基本上策略是:同步線程,以便

  1. 主線程可以獲取子線程計算出來的一些信息
  2. 該進程一直保持活動狀態,直到子線程完成其操作(如本例中)

沒有pthread_join()您看不到打印到 stdout 的消息的原因是,只要 main 終止,它就會終止整個進程並且所有子線程都將終止 在您的情況下,在執行打印之前。

  • 當您在程序中使用線程時,創建的線程將成為子線程,主程序將成為主線程。 所以,我們需要阻塞主線程,使其無法關閉。

  • 如果主線程關閉,則子線程也將退出。 因此,您需要找到阻止主線程不退出的方法。 線程為我們提供了 pthread_join() 的功能。 這將阻塞主線程,直到子線程工作。 主線程將阻塞 pthread_join() 行。 它不會執行其他行。

  • 如果你不想使用 pthread_join() 你需要找到其他方法。

Ex:

while(1);
  • 而(1); 在您終止進程之前不會結束主線程。

暫無
暫無

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

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