歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

【Linux開發技術之常見問題】一個建立線程時常見的問題:invalid conversion from `void*' to `void*(*)(void*)

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
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++編譯是會有如下錯誤(gcc不會):
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 )
Copyright © Linux教程網 All Rights Reserved