クラス内でブーストチャンネルとファイバを使用しようとしています。ここでは簡単なテストケースですがうまく動作しますしかし、それは私が欲しいものではありません。 "line:1"を "loc:1"に移動すると、プログラムがハングします(gdbはc-> push(a)の後にboost :: fibres内のスピンロックで表示されます)。私は間違って何を指して誰でも助けてくれる?ありがとう。ここで クラス内でブーストチャンネル(およびファイバー)を正しく使用する方法は?
がある作品と、次を生成し、サンプルコード、#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
有効なユーザースペースポインタがあるようですが、100%確実ではありません。私は今夜それを試し、ここに返信します。ありがとう。 – coder23
いいえ、時折segfaultsを除いて動作を変更しませんでした。 :( – coder23