我试图编译一个简单的POSIX的例子在CLIon ide,但它不知道关于pthread库,我认为…下面是代码:
void *func1()
{
int i;
for (i=0;i<10;i++) { printf("Thread 1 is runningn"); sleep(1); }
}
void *func2()
{
int i;
for (i=0;i<10;i++) { printf("Thread 2 is runningn"); 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。这是我当前的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})
回调pthread的函数签名是错误的
func1
和func2
的签名为void* (*)()
。这意味着返回一个void*并且没有参数
但是pthread想要void* (*)(void*)
这里你也有一个void*
作为参数。
所以你的函数应该是这样的:
void *func1(void* param) ...
你不必使用形参,但它必须在声明中。
注意:
告诉cmake链接到pthread,你应该这样做:
find_package( Threads REQUIRED )
add_executable(hello_world ${SOURCE_FILES})
target_link_libraries( hello_world Threads::Threads )
查看这里:我如何强制cmake包含"-pthread"选项?