2016-10-18 1 views
1

は、コードは次のとおりです。POSIXのpthread関数を使用するためにClone IDEでCMakeListを設定するには?ここでは...と思い、 を私はCLIon IDEで簡単なPOSIXの例をコンパイルしようとしたが、それはpthreadのライブラリについて知っdoesnの `t

void *func1() 
{ 
    int i; 
    for (i=0;i<10;i++) { printf("Thread 1 is running\n"); sleep(1); } 
} 
void *func2() 
{ 
    int i; 
    for (i=0;i<10;i++) { printf("Thread 2 is running\n"); sleep(1); } 
} 

int result, status1, status2; 
pthread_t thread1, thread2; 

int main() 
{ 
    result = pthread_create(&thread1, NULL, func1, NULL); 
    result = pthread_create(&thread2, NULL, func2, NULL); 
    pthread_join(thread1, &status1); 
    pthread_join(thread2, &status2); 
    printf("\nПотоки завершены с %d и %d", status1, status2); 

    getchar(); 
    return 0; 
} 

このコードがあることを、知られていますそれは本の例から取られているからです。だから、Clionは、このエラーを与え、間違いとしてpthread_joinを関数の第二引数をマーク:

error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’ 

私は考え、問題がCmakeListであるthet。ここに私の現在のCMakeListがあります:

cmake_minimum_required(VERSION 3.3) 
project(hello_world C CXX) 



set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread") 



set(SOURCE_FILES main.cpp) 
add_executable(hello_world ${SOURCE_FILES}) 
+0

の代わりに、 "それは知られている" の後に "" があります"?" – palladian

答えて

3

pthreadへのコールバックでは関数シグニチャが間違っています。

func1およびfunc2は、記号void* (*)()を有する。これは、void *を返し、パラメータを持ちません。

しかし、pthreadが必要ですvoid* (*)(void*)ここにはvoid*というパラメータもあります。

ので、あなたの関数は次のようになります。

void *func1(void* param) ... 

あなたは、パラメータを使用する必要はありませんが、それは宣言の中でそこにする必要があります。

注:

あなたがこれを使用する必要があるのpthreadにリンクするcmakeのを伝えるために:

find_package(Threads REQUIRED) 
add_executable(hello_world ${SOURCE_FILES}) 
target_link_libraries(hello_world Threads::Threads) 

はこちらをご覧ください:How do I force cmake to include "-pthread" option during compilation?

+0

まあ...問題は、関数の署名についてではなく、pthread_joinの引数status1とstatus2についてです。あなたが書いたようにCMakeListを編集しましたが、効果がありませんでした。 – palladian

+0

ボトムノートは少し異なるシナリオで私を助けました。ありがとう! –

関連する問題