【Linux開發技術之常見問題】一個建立執行緒時常見的問題:invalid conversion from `void*' to `void*(*)(void*)
【原文: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 )
相關文章
- Linux 常見問題Linux
- Laravel 個人開發常見問題Laravel
- 【多執行緒】常見問題簡單總結執行緒
- 面試常見的非技術問題面試
- 常見問題
- 四個常見的Linux面試問題Linux面試
- 24·iOS 面試題·+(void)load; +(void)initialize; 有什麼用處?iOS面試題
- DDC/NFT開發常見問題
- 近期BSN開發常見問題
- 你知道void和Void的區別嗎
- NSObject +(void)load 和+(void)initialize 方法的理解Object
- 技術人溝通中的幾個常見問題
- grub常見的幾個問題
- js常見問題JS
- Homestead 常見問題
- Apache 常見問題Apache
- Git 常見問題Git
- PHP 常見問題PHP
- swiper常見問題
- Composer 常見問題
- HTML常見問題HTML
- Git常見問題Git
- 前端常見問題前端
- 【Nginx】常見問題Nginx
- ndk 常見問題
- CSS常見問題CSS
- nginx 常見問題Nginx
- Mysql:常見問題MySql
- XSS常見問題
- MyBatis常見問題MyBatis
- java 常見問題Java
- react-native開發常見問題React
- DDC開發常見問題答疑(二)
- 近期BSN開發常見問題答疑
- 前端常見問題(一) - CSS前端CSS
- 學習WebFlux時常見的問題WebUX
- NSIS 之 NsDialogs 常見問題解答
- Java面試中,一些常見的有關多執行緒問題!Java面試執行緒
- 入行 AI 的幾個常見問題AI