语义问题"尝试使用已删除的功能"遇到用std :: thread用法编译c ++代码

时间:2014-08-18 17:22:18

标签: c++ multithreading

我正在编译包含

的代码块
  

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);
}

1 个答案:

答案 0 :(得分:1)

void timerThreadTask(int sleepLengthInMilliSec, void (*callBackFuncPtr)(int anyParam))
//                                                   ^                ^

如果没有括号,void *callBackFuncPtr(int anyParam)是一个函数类型(函数取int并返回void *),然后在函数的参数列表中转换为函数指针类型,返回类型错误(void *而不是void)。