void *thread1() if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) 提示:invalid conversion from 'void* (*)()' to 'void* (*)(void*)' ============= 改成: void *thread1(void *) void* (*)(void*): (*)表示這里需要一個函數指針, (void*)表示參數類型需要為void* 參考: http://groups.google.com/group/comp.programming.threads/browse_thread/thread/8fddb216a36daa87/b03dda5b143e8260?#b03dda5b143e8260 http://www.uplook.cn/index-Index-show-view3094.html?treeid=624 ================= void main_thread ( void *ptr ) { char *message1 = "Thread 1"; char *message2 = "Thread 2"; pthread_t thread3, thread4; int iret3, iret4; iret3 = pthread_create(&thread3, NULL, (void *)&print_message_function, (void *) message1); iret4 = pthread_create(&thread4, NULL, (void *)&print_message_function, (void *) message2); } void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); } 以上這段代碼在用g++編譯是會有如下錯誤: invalid conversion from `void*' to `void*(*)(void*) 我們注意在Posix定義建立線程函數的原型: extern int pthread_create (pthread_t *__restrict __threadp, __const pthread_attr_t *__restrict __attr, void *(*__start_routine) (void *), void *__restrict __arg) __THROW; 這個call中的第三個參數是載入一個函數,這個函數有一個參數可以傳入,返回一個 通用指針。 我們再來看看原來函數中是怎樣調用這一原型的,基本上就是類似一下的調用方式: (void *)&main_thread 這個表達式的含義:取一個指向函數main_thread的指針,然后將其轉換為一個通用指針。 這就是說顯然上述兩個事情並非同一個事情,故而正確的調用方式是 iret3 = pthread_create(&thread3, NULL, print_message_function, (void *) message1);//函數處加不加取地址符&無所謂,關鍵是第四個參數,以及函數的調用方式要寫 正確的。 處理函數的定義如下: void* print_message_function( void *ptr ) 值得注意的是在gcc編譯時不會出錯,但是用g++就會有問題,究其原因就是C語言編譯器允許隱含性的將一個通用指針轉換為任意類型的指針,而C++不允許。
轉載自:http://blog.sina.com.cn/s/blog_698f90230100xxfn.html