[英]Issue using std::atomic_flag with worker thread
sorry for the verbosity - I did my best to condense my code sample into a minimally functional class and main()
method. 对于详细程度感到抱歉 - 我尽力将我的代码示例压缩成最小功能类和main()
方法。
I'm trying to use an atomic_flag
to notify _rx()
within my worker thread to quit when stop()
is called. 我正在尝试使用atomic_flag
通知我的工作线程中的_rx()
在调用stop()
时退出。
I believe the issue is in trying to create my worker thread, 我认为问题在于尝试创建我的工作线程,
thread SanityTestThread(&SanityTest::_rx, *this);
which somehow clashes with my atomic_flag
它以某种方式与我的atomic_flag
发生冲突
code sample (does not compile): 代码示例(不编译):
#include <cstdio>
#include <chrono>
#include <unistd.h>
#include <atomic>
#include <iostream>
#include <thread>
using namespace std;
class SanityTest
{
public:
SanityTest(){}
void start();
void stop();
private:
void _rx();
atomic_flag flag;
}; // end class SanityTest
void SanityTest::_rx()
{
while(flag.test_and_set())
{
this_thread::sleep_for(chrono::seconds(1));
cout << "'sup foo" << endl;
}
} // end _rx
void SanityTest::start()
{
flag.test_and_set();
thread SanityTestThread(&SanityTest::_rx, *this);
SanityTestThread.detach();
} // end start
void SanityTest::stop()
{
flag.clear();
} // end start
int main(){
SanityTest s;// = SanityTest();
s.start();
this_thread::sleep_for(chrono::seconds(10));
s.stop();
return 0;
} // end main
For the record, I can get my program to compile and run by removing all references to my atomic_flag
and replacing my _rx()
loop with a for loop like so: 为了记录,我可以通过删除对atomic_flag
所有引用并用for循环替换我的_rx()
循环来编译和运行我的程序,如下所示:
void SanityTest::_rx()
{
for(int i=0; i <=10; ++ i)
{
this_thread::sleep_for(chrono::seconds(1));
cout << "'sup foo" << endl;
}
} // end _rx
Compiler Error: 编译器错误:
In file included from ./SanityTest.cpp:1:0:
./SanityTest.hpp:14:7: note: ‘SanityTest::SanityTest(SanityTest&&)’ is implicitly deleted because the default definition would be ill-formed:
class SanityTest
^
./SanityTest.hpp:14:7: error: use of deleted function ‘std::atomic_flag::atomic_flag(const std::atomic_flag&)’
In file included from /usr/include/c++/4.8/atomic:41:0,
from ./SanityTest.hpp:8,
from ./SanityTest.cpp:1:
/usr/include/c++/4.8/bits/atomic_base.h:275:5: error: declared here
atomic_flag(const atomic_flag&) = delete;
^
In file included from /usr/include/c++/4.8/functional:55:0,
from /usr/include/c++/4.8/thread:39,
from ./SanityTest.hpp:10,
from ./SanityTest.cpp:1:
...
In file included from ./SanityTest.cpp:1:0:
./SanityTest.hpp:14:7: note: ‘SanityTest::SanityTest(SanityTest&&)’ is implicitly deleted because the default definition would be ill-formed:
class SanityTest
^
./SanityTest.hpp:14:7: error: use of deleted function ‘std::atomic_flag::atomic_flag(const std::atomic_flag&)’
In file included from /usr/include/c++/4.8/atomic:41:0,
from ./SanityTest.hpp:8,
from ./SanityTest.cpp:1:
/usr/include/c++/4.8/bits/atomic_base.h:275:5: error: declared here
atomic_flag(const atomic_flag&) = delete;
^
In file included from /usr/include/c++/4.8/functional:55:0,
from /usr/include/c++/4.8/thread:39,
from ./SanityTest.hpp:10,
from ./SanityTest.cpp:1:
ps This is compiled with, g++ -pthread -std=c++0x -o SanityTest ./SanityTest.cpp
ps这是用,编译, g++ -pthread -std=c++0x -o SanityTest ./SanityTest.cpp
Just replace 只需更换
thread SanityTestThread(&SanityTest::_rx, *this);
with 同
thread SanityTestThread(&SanityTest::_rx, this);
You probably intended to pass a pointer to the object and not the object itself (which would result in that object being copied and the member function pointer &SanityTest::_rx
being invoked on that copy instead of the original object). 您可能希望传递指向对象的指针而不是对象本身(这将导致该对象被复制,并且在该副本而不是原始对象上调用成员函数指针&SanityTest::_rx
)。
The reason for the error message is essentially that std::atomic_flag
doesn't have a copy constructor and so the compiler doesn't generate a default one for your SanityTest
class either, but again: you don't want to copy your SanityTest object here anyway. 错误消息的原因本质上是std::atomic_flag
没有复制构造函数,因此编译器也不会为您的SanityTest
类生成默认值,但是再次:您不想复制SanityTest对象无论如何这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.