gpt4 book ai didi

c++ - asio::strand 的拷贝是否会创建一个新的执行程序?

转载 作者:行者123 更新时间:2023-12-03 18:01:29 25 4
gpt4 key购买 nike

我有一份 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 中也没有用户定义的复制构造函数。类(class)。
strand_impl ,其中包含 que、mutex、counter 以及与多线程相关的所有内容。而这东西在 strand上没有改变复制自 strand只有一个指向它的指针,并且只复制了指针(对 io_service 引用只字不提,但这个引用显然对链复制没有影响)

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

这也符合我的实验。有问题的示例中的 firstFunction 和 secondFunction 确实由 2 个线程顺序执行。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com