Создает ли asio :: strand нового исполнителя? - PullRequest
4 голосов
/ 17 февраля 2020

У меня есть копия 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?

1 Ответ

1 голос
/ 17 февраля 2020

Ответ нет .

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 в примере вопроса действительно выполнялись последовательно двумя потоками.

...