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

查志強發表於2014-06-17

【原文:http://www.cnblogs.com/gnuhpc/archive/2012/01/17/2324804.html

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 )

相關文章