invalid conversion from 'void* (*)()' to 'void* (*)(void*)'

pthread_create(&pthread, NULL, usbcallback,comment); 
invalid conversion from 'void* (*)()' to 'void* (*)(void*)'

The pthread_* functions are C language.  The C++ prototype for a thread function is

extern "C" void *thread_function(void *);


===============================================================================================
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++不允許。


但這樣修改還是報類型問題,最終是

void* usbcallback(void* args)

{

    char* info = (char*) args;

   // std::cout<<"hello, "<<info<<std::endl;

}


pthread_create(&pthread, NULL, usbcallback,comment); 
將類型轉換要放入函數中

NDK 可以使用pthread

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章