引數“opt”通過 pthread_create 傳遞給我的函式:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)
然后我的函式中有一個 switch 陳述句,它將根據情況列印兩個陳述句之一:
void* routine(void* opt) {
long int n = (long int)&opt;
switch(n) {
case 0:
printf("Test 0 from threads\n");
break;
case 1:
printf("Test 1 from threads\n");
break;
};
sleep(3);
printf("Ending thread...\n");
return NULL;
}
函式的第一行是我被卡住的地方。我正在嘗試將 num1 的原始值轉換為 'n',以便我可以將它用于 switch 陳述句。
uj5u.com熱心網友回復:
您傳入的原始值是 a intptr_t *,所以這就是您應該閱讀的內容。
intptr_t *n = opt;
switch(*n) {
uj5u.com熱心網友回復:
routine根本不以要求通過參考傳遞整數的方式使用引數。也就是說,您只使用整數的值。由于您已經在使用intptr_t,您可以利用inptr_ts 可以安全地轉換為指標并回傳的事實。
pthread_create(&t1, NULL, routine, (void*)num1);
void *routine(void *opt)
{
intptr_t n = (intptr_t)opt;
...
}
這種方法的一個好處是,由于您是按值傳遞整數,因此如果原始變數超出范圍,您將不會遇到問題。
uj5u.com熱心網友回復:
為了解決問題,您可以更改行
long int n = (long int)&opt;
到:
long int n = *(intptr_t*)opt;
但是,這似乎不是正確的解決方案。以下代碼似乎并不理想:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)
它似乎不適合使用的型別intptr_t(其目的是保持指標值作為整數),在這種情況下,如果作為證明的問題,您只需要它來存盤的值0或1。
您當然可以簡單地使用intorlong int代替資料型別intptr_t。但我懷疑您選擇了intptr_t能夠直接將值存盤在指標中的資料型別,如下所示:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, (void*)num1 );
如果這樣做,那么在函式中routine,您可以使用該行
long int n = (intptr_t)opt;
將指標轉換回數字。
第一種解決方案的缺點是,無論何時取消參考指標,都必須確保被參考物件的生命周期未過期。這不是第二種解決方案的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/342866.html
上一篇:為什么在我的輔助函式中取消參考指標變數會導致我的整個程式終止?
下一篇:為什么這個C代碼輸出1而不是0?
