※ 引述《diodio.bbs@bbs.wretch.cc (不愛就轉身離開)》之銘言:
> 一個process若要產生新的thread, 可以呼叫pthread_create, 它的prototype如下:
> int pthread_create(pthread_t *tid, const pthread_attr_t *attr,
> void *(*func)(void *), void *arg);
> 我在某書(Comer寫的)上看到一段程式碼,它是這樣寫的:
> ...
> ...
> int TCPechod(int fd);
> int ssock;
> ...
> ...
> if(pthread_create(&th, &ta, (void * (*)(void *))TCPechod,
> (void *)ssock) < 0)
> ...
> 我要問的是:
> 1.上述 (void * (*)(void *))TCPechod 看起來像是把TCPechod轉型的樣子,
> 可是TCPechod這個function的參數以及回傳值本身都是integer, 為什麼可
> 以轉成(void *).
> 2.類似1, ssock本身是integer, 被轉成(void *)後會變成什麼; TCPechod裡
> 面的fd的值為什麼等於ssock.
> 請各位大大不吝賜教
1. C language 的規定下本來就可以這樣轉,
反之如果你不這樣轉,
C compiler 會給你 warning message,
C++ compiler 會給你 error message,
因為送進去的 function pointer type 和 pthread_create() 要的不符合。
2. 這是 sizeof(int) == sizeof(void *) 世代裡常見的寫法,
因為兩者等寬,
所以把 int 轉成 void * 再轉回 int 是完全沒有問題的,
ssock 並不會因為被轉成 void * 而使得內容有所改變,
memory 中所有的 bits 都是完全一致的。
如果你將來會常用 C + pthread,
那就把這些方法學起來也無所謂,
否則最好不要學,
因為這些技巧在現代而言是很糟糕的示範。
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Undecided
Homepage: https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮ < IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰ * From:61-230-217-124.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 ◎