繼承人的代碼片段:pthread我可以得到原始的參數嗎?
pthread_create(&worker->thread, NULL, EagleWorker_begin, worker);
void* EagleWorker_begin(void *obj)
{
EagleWorker *worker = (EagleWorker*) obj;
}
這工作正常,但有沒有辦法恢復從當前線程obj
,而不必通過它一路走過每一個功能?
繼承人的代碼片段:pthread我可以得到原始的參數嗎?
pthread_create(&worker->thread, NULL, EagleWorker_begin, worker);
void* EagleWorker_begin(void *obj)
{
EagleWorker *worker = (EagleWorker*) obj;
}
這工作正常,但有沒有辦法恢復從當前線程obj
,而不必通過它一路走過每一個功能?
是的。你可以使用特定於線程的數據(線程本地存儲)來使線程變寬「全局變量」。線程代碼可以像正常的全局變量那樣訪問它們。但是每個線程都有它自己的全局空間。
試試這個。
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()中。
這回答了這個問題 - 但我會避免__thread。它將爲線程的每個實例創建線程本地對象,無論它是否需要它。我覺得在堆棧上分配會更好。你可以把它全部包裝在一個類中,並且在創建線程之後再也不用擔心它。 – 2013-05-08 14:42:30
沒有必要爲演員。在c中'void *'可以毫無問題地轉換爲任何其他指向數據類型的指針。 – 2013-05-08 12:17:01
@JensGustedt取決於實際應用兩種衝突的語言標記中的哪一個。 – 2013-05-08 14:45:09