12

このようなことを頻繁に行う必要があります。

AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation );
thread.join();

(関数オブジェクトとも呼ばれます) をAsyncOperation実装する任意のカスタム クラスです。operator()

の代わりにstd::bindを使用することを に示すことは可能ですか? これにより、 で参照を保持する必要なく、メモリ リークが防止され、スレッドの最後で自動的にが削除されます。つまり、この非同期タスクの最後です。std::shared_ptrstd::refpAsyncOperationAsyncOperation

編集:私は常にstd::threadにアクセスできるとは限りません.スレッドライブラリはboost::threadまたはその他のプラットフォーム依存スレッドである可能性があります. 結果として、std::async にはアクセスできません。

私の主な問題は、std::bind で所有権の概念を持つことです。

4

2 に答える 2

14

これは機能します:

struct AsyncOperation {
    void operator()()
    {
        std::cout << "AsyncOperation" << '\n';
    }
};

int main() {
  std::shared_ptr<AsyncOperation>  pAsyncOperation = std::make_shared<AsyncOperation>();
  auto bindOperation = std::bind(&AsyncOperation::operator(), pAsyncOperation);
  std::thread thread(bindOperation );
  thread.join();
}

参照: http://liveworkspace.org/code/4bc81bb6c31ba7b2bdeb79ea0e02bb89

于 2012-11-07T15:51:24.923 に答える
7

AsyncOperation動的に割り当てる必要がありますか? そうでない場合は、次のようにします。

auto f = std::async([]{ AsyncOperation()(); });
f.wait();

それ以外は:

std::unique_ptr<AsyncOperation> op(new AsyncOperation);
auto f = std::async([&]{ (*op)(); });
f.wait();

もちろん を使用することstd::threadもできますが、より多くの問題 (つまり、他のスレッドでの例外処理) が発生する可能性があります。std::bind独自の問題もあり、おそらくラムダで終わる方がよいでしょう。

所有権を他のスレッドに渡す必要がある場合は、次のようにすることもできます。

std::unique_ptr<AsyncOperation> op(new AsyncOperation);
auto f = std::async([&](std::unique_ptr<AsyncOperation> op){ (*op)(); }, std::move(op));
f.wait();

ラムダは移動タイプのキャプチャをまだサポートしていないためです。

それが役立つことを願っています。

于 2012-11-07T15:44:44.607 に答える