我正在编写一个多线程应用程序,并且处理新线程的函数声明如下:
void * Client::sendMessage(void *threadid) {
// some code without any return
}
我这样称呼这个功能:
// create new thread for outcomming messages
pthread_t thread;
pthread_create(&thread, NULL,
c->sendMessage, (void *) fd);
它工作得很好,但是当我在这个命令中用这些标志编译它时:
g++ main.cpp -Wall -pedantic -Wno-long-long -O0 -ggdb -lncurses -pthread -o ChatApp
,它让我收到这样的消息:
Client.cpp: In static member function ‘static void* Client::sendMessage(void*)’:
Client.cpp:167:1: warning: no return statement in function returning non-void [-Wreturn-type]
所以我的问题是,在汇编过程中,我将如何回归,摆脱这些警告?
答案 0 :(得分:2)
您将sendMessage
函数的地址作为第三个参数传递给pthread_create
。
调用pthread_create
会创建一个新线程,该线程在启动例程(在本例中为您的sendMessage
函数)返回时(或在其他几种情况下)终止。从start例程返回一个值相当于将相同的值传递给pthread_exit()
。如果该线程调用void*
,那么start例程返回的pthread_join
值可以用于同一进程中的另一个线程。
它是void*
值,因为void*
是一个通用指针,而不是指向任何类型的对象。如果要使用此机制将信息从终止线程传递到另一个线程,则需要确定一种机制来执行此操作。如果您不需要传递此类信息,那么您的启动例程返回的内容并不重要;最简单的事情是return nullptr;
。
答案 1 :(得分:1)
void *
与void函数不同。 void *
是一个指针,但它可以更安全地指向任何东西,在c ++中你不应该非常使用void *
但它应该返回的是一个指针。在这种情况下,您可能只需要返回threadid
。顺便说一句,在你的情况下发生的事情是函数默认返回0(所以NULL)也可能没问题,很难从提供的代码量知道
答案 2 :(得分:1)
返回与您的职能合同一致的任何内容。如果真的总是忽略回报,请考虑将您的回报类型更改为无效。