我最近讀了一本關于如何在unix環境中撰寫代碼的書。有一個示例代碼讓我很困惑。
示例代碼:
#include "apue.h"
#include <pthread.h>
void *
thr_fn1(void *arg) {
printf("thread 1 returning\n");
return ((void *)1);
}
void *
thr_fn2(void *arg) {
printf("thread 2 exiting\n");
pthread_exit((void *)2);
}
int
main(void) {
int err;
pthread_t tid1, tid2;
void *tret;
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != 0) {
err_exit(err, "can't create thread 1");
}
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if (err != 0) {
err_exit(err, "can't create thread 2");
}
err = pthread_join(tid1, &tret);
if (err != 0) {
err_exit(err, "can't join with thread 1");
}
printf("thread 1 exit code %ld\n", (long)tret);
err = pthread_join(tid2, &tret);
if (err != 0) {
err_exit(err, "can't join with thread 2");
}
printf("thread 2 exit code %ld\n", (long)tret);
exit(0);
}
如何找出“(void *)1”或“(void *)2”?可以將型別“void *”轉換為“long”嗎?在我看來,“(void *)1”告訴我 1 是一個地址,但是當我使用 deref 來獲取存盤在地址 1 的值時,這顯然是錯誤的。所以,我認為這段代碼很瘋狂。
uj5u.com熱心網友回復:
c代碼中“(void *)2”的含義是什么?
這意味著將值 2 轉換為“指向void”的型別。
…
pthread_exit((void *)2);
通常一個執行緒應該回傳一個指向資料的指標(或者使用正常的函式回傳機制或者通過它作為引數傳遞給pthread_exit)。在這種情況下,資料太小了,作者認為不值得只為資料分配記憶體;他們將簡單地使用指標本身來表示資料。所以他們將所需的值轉換為void *型別。
這種行為并未完全由 C 標準定義,但它適用于許多 C 實作,尤其是那些用于 Unix 系統的實作。呼叫者應將其轉換void *回整數型別以解釋該值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517851.html
下一篇:Unix并行解壓縮檔案并存盤它們
