2013-01-19 75 views
0

我是從我們哪裏知道,在pthread_create()函數傳遞NULL爲第二個參數時,線程是由可連接的要求。並行線程POSIX的C庫detachstate

我的意思是,我知道那個人頁面狀態,這樣,但是在代碼的理由是要求。 我知道,當NULL傳遞中,將使用默認的屬性:

const struct pthread_attr *iattr = (struct pthread_attr *) attr; if (iattr == NULL) /* Is this the best idea? On NUMA machines this could mean accessing far-away memory. */ iattr = &default_attr;

我知道,它應該是介於pthread庫的代碼,但我不知道確切位置。

我知道的default_attr的定義是pthread_create.c:

static const struct pthread_attr default_attr = { /* Just some value > 0 which gets rounded to the nearest page size. */ .guardsize = 1, };

http://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_create.c;h=4fe0755079e5491ad360c3b4f26c182543a0bd6e;hb=HEAD#l457

,但我不知道什麼地方正好在代碼表示,這導致可連接的線程。

在此先感謝。

+1

同樣,在你前面的問題似乎有很多混亂的地方節目的某種行爲的擔保來自。 POSIX(以及POSIX線程)是一個國際標準,它規定了相應編寫的程序的行爲。你不會在代碼中找到'pthread_create'調用的語義,但是在標準中。在你最喜歡的搜索引擎中搜索「opengroup」和「pthread_create」,你應該找到正式的規範。 –

+0

好吧,我明白了。但是,當我的老師問我關於源代碼合理性的問題時,我該說什麼?我的意思是,當我說沒有可以證明的代碼時,恐怕只有POSIX規範,這並不是全部的真相,這可能對我造成嚴重影響。) – user1991012

+0

不要怕你的老師。如果他提出這樣的要求,他應該在代碼中說明他的意思。其實這通常是你應該問他的問題,而不是我們。 –

回答

2

首先,從粘貼的代碼中可以看出,default_attr幾乎在所有字段中都包含零(在C中沒有半初始化變量:如果只初始化某些字段,其他字段設置爲0 )。

其次,pthread_create包含以下代碼:

/* Initialize the field for the ID of the thread which is waiting 
    for us. This is a self-reference in case the thread is created 
    detached. */ 
pd->joinid = iattr->flags & ATTR_FLAG_DETACHSTATE ? pd : NULL; 

此行檢查iattr->flags是否具有ATTR_FLAG_DETACHSTATE位設置,其中(對於default_attr)它不會因爲default_attr.flags是0。因此它設置​​到NULL和而不是pd與分離的線程。

(請注意,這個答案只適用於GNU glibc的,而不是POSIX一般的並行線程)。

+0

非常感謝!很可能這就是我一直在尋找的答案。 – user1991012