我有一个asio::io_service::strand的拷贝。
复制的子线及其来源是否是不同的执行者?换句话说,传递给复制链的函数和传递给源链的另一个函数是否有可能由两个不同的线程在同一时间执行?

还是这两个链在逻辑上都是“一个链”,这意味着传递给它们的任何工作都不会与传递给它们的其他工作一起执行?

看例子

asio::io_service ioService;

asio::io_service::strand strandFromIoService{ioService};
asio::io_service::strand strandFromStrand{strandFromIoService};

strandFromIoService.post(boost::bind(&firstFunction));
strandFromStrand.post(boost::bind(&secondFunction));

// then use a pool of threads to service io_service ...
// can firstFunction and secondFunction be executed in one time?

最佳答案

答案是
strand类仅具有两个属性

class io_service::strand
{
public:
  // ...
private:
  asio::detail::strand_service& service_;
  asio::detail::strand_service::implementation_type impl_;
};
impl_strand_impl的指针:
typedef strand_impl* implementation_type;
strand类中也没有用户定义的拷贝构造函数。
它是strand_impl,其中包含que,mutex,counter和所有与多线程相关的东西。而且由于strand仅具有指向它的指针并且仅复制了指针,因此在strand复制上不会更改这些内容(不提及io_service引用,但是该引用显然对链复制没有影响)

因此,拷贝和源链在逻辑上是同一链。他们代表同一执行人。

这也符合我的实验。所讨论的示例中的firstFunction和secondFunction实际上是由2个线程顺序执行的。

关于c++ - asio::strand的拷贝会创建新的执行程序吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60262244/

10-11 21:01