我正在编译包含
的代码块std :: thread :: thread(Fp fp&& __,Args&& ...__ args)
的功能,如文档c++ reference中所述,执行以下操作:
(2)初始化构造函数 构造一个表示新的可连接执行线程的线程对象。 新的执行线程调用fn将args作为参数传递(使用其左值或右值引用的衰减副本)。 此构造的完成与调用此fn。
副本的开始同步
我想这意味着“线程在构造后将执行函数Fn。”
但是我在编译期间遇到语义问题,在下一行的库源文件 thread 中说“尝试使用已删除的函数”:
__invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
我在XCode,Mac OS上使用支持C ++ 11的LLVM C ++ std库。我知道这个std :: thread类是一个C ++ 11的特性,不适用于C ++ 98.任何使代码可编译的建议?指出不正确使用C ++函数或类也是值得赞赏的。
我的代码每次收到端口事件时都会尝试执行timerThreadTask。 timerThreadTask将在给定的睡眠长度后执行callBackFunc,但如果下一个端口事件在睡眠超时之前发生,则不会这样做:
#include <iostream>
#include <thread>
#include "unistd.h"
using namespace std;
thread *timerThread;
bool interrupted = false;
void callBackFunc(int anyParam) {
// Perform your timeout handling
cout << "Callback handling with parameter input " << anyParam << endl;
}
void timerThreadTask(int sleepLengthInMilliSec, void *callBackFuncPtr(int anyParam)) {
// Thread procedures
int counter = 100;
int sleepIntervals = sleepLengthInMilliSec / counter;
while (counter-- > 0) {
if (interrupted == true) { // Interrupted
cout << "Sleep interrupted because a new port event is received." << endl;
interrupted = false; // Kill thread
delete timerThread;
timerThread = NULL;
return;
}
usleep(sleepIntervals);
}
callBackFuncPtr(10); // Timeout, execute callback
}
void onPortEventReceived() {
// If a message is received in time, then a thread
// will still be executing. The timer is to be
// restarted.
if (timerThread != NULL) {
interrupted = true;
}
int sleepLengthInMilliSec = 1000; // Set timer
// Starts a timer thread (**** When this line is commented, the compile will success but this will surely be meaningless)
timerThread = new thread(timerThreadTask, sleepLengthInMilliSec, callBackFunc);
}
答案 0 :(得分:1)
void timerThreadTask(int sleepLengthInMilliSec, void (*callBackFuncPtr)(int anyParam))
// ^ ^
如果没有括号,void *callBackFuncPtr(int anyParam)
是一个函数类型(函数取int
并返回void *
),然后在函数的参数列表中转换为函数指针类型,返回类型错误(void *
而不是void
)。