- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在类里面使用 boost channel 和光纤。这是一个简单的测试用例,工作正常,但它并不是我想要的。如果我将“line:1”移至“loc:1”,程序将挂起(gdb 在 c->push(a) 之后显示在 boost::fibers 内的自旋锁处).谁能指出我做错了什么来帮助我?谢谢。
这是运行并生成以下内容的示例代码,
#include <iostream>
#include <boost/fiber/all.hpp>
using namespace std;
template <class T>
class Block
{
private:
typedef boost::fibers::buffered_channel<T> channel_t;
typedef boost::fibers::fiber fiber_t;
fiber_t _thread_send;
fiber_t _thread_recv;
size_t _n;
channel_t* _chan;
public:
Block(size_t n) : _n(n), _chan(nullptr) {
// >>>>>>>>>> loc:1 <<<<<<<<<<<
}
virtual ~Block() {}
void _send(channel_t *c) {
cout << __func__ << endl;
int a = 1000;
cout << "Sending: " << a << endl;
c->push(a);
}
void _recv(channel_t *c) {
cout << __func__ << endl;
int a = 0;
c->pop(a);
cout << "Received: " << a << endl;
}
void do_work() {
cout << "do_work\n";
channel_t temp{_n}; _chan = &temp; // <<<<<<<<<<<< line:1
_thread_send = boost::fibers::fiber(bind(&Block::_send, this, _chan));
_thread_recv = boost::fibers::fiber(bind(&Block::_recv, this, _chan));
_thread_send.join();
_thread_recv.join();
}
};
int main()
{
Block<int> B(2);
B.do_work();
return 0;
}
输出:
do_work
_send
Sending: 1000
_recv
Received: 1000
编译使用:
GNU/Linux 64 bit x86-64
g++ (GCC) 7.1.1 2017051
boost 1.64.0
g++ -c --std=c++14 -g -Wall -Wpedantic boost_channels.cpp -o boost_channels.o
g++ -lboost_context -lboost_fiber boost_channels.o -o boost_channels
最佳答案
channel_t temp{_n}; _chan = &temp; // <<<<<<<<<<<< line:1
in Block()
将不起作用,因为 temp 在离开 Block()
后超出范围' s body 和 _chan 将指向垃圾/释放的内存
两个版本是可能的:
1) 保持 channel temp 为 do_work() 的局部变量:
template <class T>
class Block
{
private:
typedef boost::fibers::buffered_channel<T> channel_t;
typedef boost::fibers::fiber fiber_t;
fiber_t _thread_send;
fiber_t _thread_recv;
size_t _n;
public:
Block(size_t n) : _n(n) {
}
virtual ~Block() {}
void _send(channel_t *c) {
cout << __func__ << endl;
int a = 1000;
cout << "Sending: " << a << endl;
c->push(a);
}
void _recv(channel_t *c) {
cout << __func__ << endl;
int a = 0;
c->pop(a);
cout << "Received: " << a << endl;
}
void do_work() {
cout << "do_work\n";
channel_t chan{_n};
_thread_send = boost::fibers::fiber(bind(&Block::_send, this, & chan));
_thread_recv = boost::fibers::fiber(bind(&Block::_recv, this, & chan));
_thread_send.join();
_thread_recv.join();
}
};
2) 保持 channel temp 为 Block<> 的成员变量:
template <class T>
class Block
{
private:
typedef boost::fibers::buffered_channel<T> channel_t;
typedef boost::fibers::fiber fiber_t;
fiber_t _thread_send;
fiber_t _thread_recv;
channel_t _chan;
public:
Block(size_t n) : _chan(n) {
}
virtual ~Block() {}
void _send(channel_t *c) {
cout << __func__ << endl;
int a = 1000;
cout << "Sending: " << a << endl;
c->push(a);
}
void _recv(channel_t *c) {
cout << __func__ << endl;
int a = 0;
c->pop(a);
cout << "Received: " << a << endl;
}
void do_work() {
cout << "do_work\n";
_thread_send = boost::fibers::fiber(bind(&Block::_send, this, & _chan));
_thread_recv = boost::fibers::fiber(bind(&Block::_recv, this, & _chan));
_thread_send.join();
_thread_recv.join();
}
};
两个版本都生成:
do_work
_send
Sending: 1000
_recv
Received: 1000
关于c++ - 如何在类里面正确使用 boost channel (和光纤)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023761/
计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它👇 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 。 👇博主的上篇连载文章《初识图像处理技术》 。 图像处理
我正在尝试通过引用 document 在我的笔记本电脑上安装 Sunbird . 但是在 npm install 上出错步 gyp WARN install got an error, rolling
我使用 npx create-nuxt-app 创建了一个 Nuxt 应用程序 但是当运行开发服务器时 npm run dev出现以下错误 ╭────────────────────────────
我是一名优秀的程序员,十分优秀!