多執行緒執行順序詭異現象談,你不知道的pthread_create

HadoopDev發表於2018-02-07

引文:學而時習之,不亦說乎。總是忙於具體專案,業務功能的實現;關於程式設計本身的技能都要有些生疏了,於是就選擇了幾個專題做了一次溫習,重點放在了多執行緒和多程式上,跑了一個例項,居然有新的發現:

(1)多個執行緒順序建立的順序=執行緒執行順序嗎?

(2)多個執行緒順序建立,回撥函式執行順序有規律嗎?

示例

#include "apue.h"
#include <pthread.h>

void *
thr_fn1(void *arg)
{
    printf("thread 1 returning\n");
    return((void *)1);
}

void *
thr_fn2(void *arg)
{
    printf("thread 2 exiting\n");
    pthread_exit((void *)2);
}

int
main(void)
{
    int            err;
    pthread_t    tid1, tid2;
    void        *tret;

    err = pthread_create(&tid1, NULL, thr_fn1, NULL);
    if (err != 0)
        err_quit("can't create thread 1: %s\n", strerror(err));
    /*sleep(1);*/
    err = pthread_create(&tid2, NULL, thr_fn2, NULL);
    if (err != 0)
        err_quit("can't create thread 2: %s\n", strerror(err));
    err = pthread_join(tid1, &tret);
    if (err != 0)
        err_quit("can't join with thread 1: %s\n", strerror(err));
    printf("thread 1 exit code %d\n", (int)tret);
    err = pthread_join(tid2, &tret);
    if (err != 0)
        err_quit("can't join with thread 2: %s\n", strerror(err));
    printf("thread 2 exit code %d\n", (int)tret);
    exit(0);
}

輸出

thread 2 exiting
thread 1 returning
thread 1 exit code 1
thread 2 exit code 2

討論

  看到這個順序是否有點意外,從多執行緒實現的機制來講,這個順序是沒問題的,建立的過程不等於執行的過程,各種教科書都會這麼告訴我們。可是我想知道的是,建立的順序是否和執行的順序有關係呢?還是用資料說話吧,我執行了10次,每次的輸出順序都是如此。這個引起了我的興趣。執行緒2為何每次都是優先於執行緒1執行呢?按照cup順序工作的原理,執行緒1應該先得到時間片才對啊,至少執行緒1和執行緒2應該具有同等的執行順序才對。為何每次的結果都是執行緒2限制性?卻是執行緒1先完成呢?糾結探索中,有條件的園友可以自己測試一下,看看是否有同樣的問題呢。

疑問1:同時建立執行緒是否執行緒2優先於1呢?-----單臺機器實測來看貌似如此。

疑問2:順序建立時間差增大,執行順序會如何?我線上程1建立後做了一個sleep(1),結果:

thread 1 returning
thread 1 exit code 1
thread 2 exiting
thread 2 exit code 2

疑問3:順序建立執行緒,執行緒2的執行順序為何優於執行緒1?探索中...!求答案!

環境

vmware8.0 + windows xp + REHL6.3

相關文章