2012-06-03 68 views
1

如果我創建一個使用Linux下Pthread庫線程,我需要使用功能pthread_create,因爲它需要void *的論據之一,所以我可以傳遞一個指針的東西,所以我線程程序可以得到訪問它,但它是安全的,做這樣的事情Linux的pthread庫,螺紋參數

{//some scope 
    int a=5//scope variable 
    pthread_create(&id,NULL,some_function,(void*)a); 
}//end of scope 

,並在我的例行:

void *some_function(void *_arg) 
{ 
    int a=(int)arg; 
    return NULL; 
} 

我想要做這樣的事情,所以我可以保持一個變量的值上因此我可以訪問它在我的線程例程中,但我不想爲單個變量創建結構或手動分配內存。

我將要創建的線程數是這樣,所以我想知道,如果在這樣的情況下,我能得到通過,不要使用列表或動態數組。

回答

4

你正在做什麼是現實世界中的絕對安全:intvoid *之間的轉換是不是不確定的行爲,這是實現定義的,並且所有的實現在自然,理智的方法來定義它。它也是將單個整數參數傳遞到新線程的唯一有效方法。都需要昂貴的同步的其他方法,無論是通過顯式鎖定或者在新的線程(其藏在malloc/free實現隱性成本同步),使用原來的線程mallocfree

有一件事你會發現,然而,就是在轉換一些編譯器發出警告。這是因爲舊的破碼,假設int可以代表void *的全部值;編譯器無法在一個void *存儲一int的(有效)的做法之間進行區分,並且在int存儲void *的(無效)的做法。作爲一種解決方案,您可能需要使用intptr_t而不是int,這將避免此警告。如果您的原始變量爲int,則只需通過intptr_t添加額外的中間投射就可以避免警告。

+0

+1,我刪除我的答案,你有正確的一個。 – ouah

+0

謝謝你的回答。 – Andna

1

在這種情況下,它是安全的「經由ARG參數的堆棧因爲void*」來的a值推到some_function的規模足夠大,以支持一個整數的值。