2013-05-08 30 views
2

繼承人的代碼片段:pthread我可以得到原始的參數嗎?

pthread_create(&worker->thread, NULL, EagleWorker_begin, worker); 

void* EagleWorker_begin(void *obj) 
{ 
    EagleWorker *worker = (EagleWorker*) obj; 
} 

這工作正常,但有沒有辦法恢復從當前線程obj,而不必通過它一路走過每一個功能?

+0

沒有必要爲演員。在c中'void *'可以毫無問題地轉換爲任何其他指向數據類型的指針。 – 2013-05-08 12:17:01

+1

@JensGustedt取決於實際應用兩種衝突的語言標記中的哪一個。 – 2013-05-08 14:45:09

回答

4

是的。你可以使用特定於線程的數據(線程本地存儲)來使線程變寬「全局變量」。線程代碼可以像正常的全局變量那樣訪問它們。但是每個線程都有它自己的全局空間。

試試這個。

pthread_create(&worker->thread, NULL, EagleWorker_begin, worker); 

__thread EagleWorker *worker; 

void* EagleWorker_begin(void *obj) 
{ 
    worker = (EagleWorker*) obj; 

    foo(); 
} 

void foo() 
{ 
    worker->whatever = whatever; 
} 

您仍然需要確保爲每個線程分配一個EagleWorker並將其傳遞到pthread_create()中。

+0

這回答了這個問題 - 但我會避免__thread。它將爲線程的每個實例創建線程本地對象,無論它是否需要它。我覺得在堆棧上分配會更好。你可以把它全部包裝在一個類中,並且在創建線程之後再也不用擔心它。 – 2013-05-08 14:42:30

相關問題