如果您顯示Tparam
的聲明方式,可能會有所幫助。
但是,如果您希望每個線程都有自己的空間來存儲某些數據,那麼您可以安排將該空間作爲該函數的參數傳遞給線程。例如:
enum { NTHREADS = 10 };
struct TLS_Data
{
int id;
char buffer[2048];
size_t index;
} data[NTHREADS];
for (int c1 = 0; c < NTHREADS; c1++)
{
data[c1].index = c1;
data[c1].id = 0;
data[c1].buffer[0] = '\0';
int rc = pthread_create(&threads[c1], NULL, Thread_Pool, &data[c1]);
...handle errors, etc...
}
請注意缺少對pthread_create()
的最後一個參數進行強制轉換;當範圍內有原型時,不需要將指針轉換爲void *
。
在您的Thread_Pool
中,您似乎想將參數視爲整數;這也可以做到。傳遞一個指向整數的指針是乾淨的;你可以直接通過整數值,如果你真的堅持:
uintptr_t value = c1 + 10;
rc = pthread_create(&threads[c1], NULL, Thread_Pool, (void *)value);
由於value
類型是uintptr_t
,你知道它是能夠保持一個空指針,所以它給你的東西工作的最大機會。但是你正在與類型系統打交道,這使得編寫乾淨的代碼變得更加困難。
需要注意的一件事是,如果它們應該看到不同的值,則需要確保傳遞給線程函數(在您的示例中爲Thread_Pool()
)的數據不在線程之間共享。沒有線程的執行順序的保障,因此,如果你犯了一個錯誤,如:
uintptr_t value = c1 + 10;
rc = pthread_create(&threads[c1], NULL, Thread_Pool, &value);
(和代碼是在一個循環中),那麼會是沒有什麼每個線程功能保證會看到。要小心!
pthread_keycreate等閱讀文檔。 – bmargulies
爲什麼不使用線程局部變量,使用__thread前綴?如__thread int tl_var;其次,你不能寫空指針,因爲它指向寫保護的位置0!如果你嘗試這樣做,你會得到一個分段錯誤。 – MetallicPriest
@bmargulies我讀了pthread_keycreate,我只是想知道這是否會起作用,因爲我認爲它更容易,並且比你的答案要好。 – CodeRed