2017-04-06 4 views
1

C++ 11の並行処理プリミティブを使用して、まともなwait_any実装がありますか?C++ 11の並行処理プリミティブを使用して、まともなwait_any実装がありますか?

またはそれをC++ 11のmutex、condition_variable、...で実装する方法は?

C++ 11だけでなく、ネイティブのLinuxシステムコールとpthreadを実装する際の一般的な考え方とアルゴリズムは何ですか?

...などミューテックスの

+0

投稿を更新し、コメントに詳細を追加しないでください。 –

+0

Boost.Threadは、[when_any](http://www.boost.org/doc/libs/1_63_0/doc/html/thread/synchronization.html#thread.synchronization.futures.reference)を含むContinuationsを継承した先物を実装しています。 .when_any)。これがあなたの「まともな」概念を満たしているかどうかはわかりませんが、それは比較的よくテストされた実装です。しかし、この実装は厳密にはC++ 11プリミティブのみを使用しているわけではないので、コメントのみです。 – ComicSansMS

+0

@ComicSansMSブーストによっては重すぎることがある。 1つを実装する方法に関する良い指示はありますか? (ネイティブのLinux APIであっても) – Adam

答えて

1

when_anyはC++ stdに存在しません。

通常、メッセージのプロデューサ - コンシューマキューを使用します。どのサフィアもキューにメッセージをキューイングできます(「準備ができました」など)。

多くのこのようなキューで待機しているスレッドは非常に複雑になります。

実際には、C++標準のプリミティブからビルドするため、クライアントコードで直接使用することはありません。

+0

私は実際には 'queue'のことが大好きです。キューにインデックスを入れて、ベクトルのインデックスを使ってデータにアクセスしてfuture.get()を使用することができます – Adam

+0

非常に実用的で、私はこれをお勧めしたいと思います回答。しかし、私はこれを行うには、指示や記事や本があれば、私に通知してください、それを行うことを学ぶしたいと思います。 – Adam

+1

ここにはタスクのスレッドキューがあります:http://stackoverflow.com/a/30180853/1774667おそらくstackoverflowのどこかに 'threaded_queue 'があります。 – Yakk

1

あなたが唯一のポーリングを持つことができます(ビジーウェイト)の実装をwait_anyが利用できるようにベクトル/アレイ内の任意の先物を待っている、または複数のcondition_variablesのいずれかが通知されると、待機中のスレッドをCPUから降格させるためにOS機能を使用しない場合は、条件変数を使用します。

また、OSの関与がなければ、強力なミューテックスや優先度の反転緩和などのことはできません。

+0

OSの機能を実装する方法はありますか? – Adam

+0

@Adamソースコード形式の作業指示書:https://sourceware.org/git/?p=glibc.git;a=tree;f=nptl –

+0

これはglibcとpthreadソースであり、私にいくつか教えてくれます余分な記事や書籍について読む? – Adam

関連する問題