我正在尝试使用C ++ 11中的std :: thread。如果可以在执行其某个函数成员的类中使用std :: thread,我找不到任何地方。考虑下面的例子...... 在我的尝试(下面)中,函数是run()。
我使用-std = c ++ 0x flag编译gcc-4.4。
#ifndef RUNNABLE_H
#define RUNNABLE_H
#include <thread>
class Runnable
{
public:
Runnable() : m_stop(false) {m_thread = std::thread(Runnable::run,this); }
virtual ~Runnable() { stop(); }
void stop() { m_stop = false; m_thread.join(); }
protected:
virtual void run() = 0;
bool m_stop;
private:
std::thread m_thread;
};
class myThread : public Runnable{
protected:
void run() { while(!m_stop){ /* do something... */ }; }
};
#endif // RUNNABLE_H
我收到了这个错误和其他错误:(有和没有$ this的错误相同)
Runnable.h|9|error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, Runnable* const)’|
传递指针时。
Runnable.h|9|error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&Runnable::run’|
答案 0 :(得分:16)
这里有一些代码要仔细考虑:
#ifndef RUNNABLE_H
#define RUNNABLE_H
#include <atomic>
#include <thread>
class Runnable
{
public:
Runnable() : m_stop(), m_thread() { }
virtual ~Runnable() { try { stop(); } catch(...) { /*??*/ } }
Runnable(Runnable const&) = delete;
Runnable& operator =(Runnable const&) = delete;
void stop() { m_stop = true; m_thread.join(); }
void start() { m_thread = std::thread(&Runnable::run, this); }
protected:
virtual void run() = 0;
std::atomic<bool> m_stop;
private:
std::thread m_thread;
};
class myThread : public Runnable
{
protected:
void run() { while (!m_stop) { /* do something... */ }; }
};
#endif // RUNNABLE_H
一些注意事项:
m_stop
与您一样简单bool
是非常不够的;阅读内存障碍std::thread::join
可以扔掉所以在没有析构函数的try..catch
的情况下调用它是鲁莽的std::thread
和std::atomic<>
是不可复制的,因此Runnable
应标记为此类,如果没有其他原因,请避免使用VC ++发出C4512警告答案 1 :(得分:15)
这种做法是错误的。
问题是,虽然对象仍在构建中,但它的类型仍然不是派生类型最多的类型,而是正在执行的构造函数的类型。这意味着当你启动线程时,对象仍然是Runnable
,并且对run()
的调用可以被调度到Runnable::run()
,这是纯虚拟的,这反过来会导致未定义的行为
更糟糕的是,您可能会遇到虚假的安全感,因为在某些情况下,正在启动的线程可能需要足够长的时间才能使当前线程完成Runnable
构造函数,并输入myThread
对象,在这种情况下,新线程将执行正确的方法,但更改执行程序的系统(不同的核心数,或系统的负载,或任何其他不相关的情况)并且程序将在生产中崩溃。