1

2つ(またはそれ以上)のスレッドが並行して動作しています。それらの目的はハードウェアデバイスを測定することであり、外部のハードウェア刺激に依存しています。実行中のある時点で、ハードウェアデバイスをトリガーし、刺激を待ちます。しかし、私は刺激装置を1つしか持っていません。

したがって、すべてのスレッドが刺激を受け取る準備ができるまで、スレッドは待機する必要があります。ここで、別のスレッド(おそらくディスパッチングメインスレッド)がデバイスをトリガーする必要があり、スレッドは続行できます。

これを同期するためのベストプラクティスは何ですか?動的な数のスレッドで好ましいですか?

編集: CVI/Labwindowsを使用します。それはいくつかのスレッドを提供しますが、ほとんどは悪い文書化されたマクロを介して行われます。スレッドを登録し、開始し、終了するのを待つ方法を理解しました。

スレッドセーフな変数とロックを作成するためのツールもあるようです。しかし、それらの構文は私にはわかりません。したがって、私はある種のミューテックス/セマフォを自分で構築する必要があります。

4

2 に答える 2

0

つまり、マルチスレッドを備えたCのバージョン(ISOおよびANSI)はC11だけです。その周りにはそれほど多くの実装がないので、おそらくあなたは何か違うことを意味します。

C11では、スレッド間で同期するためのツールは2つあります。1つは、POSIXスレッドにも存在するのと同じ精神で、古典的なスレッドデータ構造、つまりミューテックスと条件変数です。(セマフォはオプション機能のみです。)

C11でスレッドを同期するための2番目のツールはatomic変数です。これはPOSIXに相当する機能はありませんが、すべての最新アーキテクチャでネイティブにサポートされています。

于 2012-12-04T10:06:16.623 に答える
0
  1. したがって、最初にすべてのN個のワーカースレッドを「準備完了モード」にする必要があります
  2. 刺激スレッドが刺激を送信します。(他のすべての準備が整うまで待つ必要があります)
  3. その後、すべてのスレッドが機能し始めるはずです。

したがって、1。と2の間に、セマフォ(初期カウント0、最大カウントnThreads)が必要です。これは、各ワーカースレッドによって1回通知され、スティミュラススレッドによってN回待機されます。
2.と3の間では、同期が必要です。これは、ワーカースレッドは、刺激スレッドが刺激を送信するまで待機する必要があるためです。これは、各ワーカースレッドのセマフォ(初期カウント0最大カウント1)によっても実現できます。

刺激スレッドの擬似コード:

init stimulus-semaphore and one semaphore for each worker-thread
start threads
while (1) {
  for (int i=0;i<nThreads;i++)
    wait for stimulus-semaphore
  do the stimulus-thing
  for (int i=0;i<nThreads;i++)
    signal threads[i] semaphore
}

ワーカースレッドの擬似コード:

while (1) {
  signal stimulus-semaphore
  wait for this threads semaphore
  do the work to be done after stimulus was sent
}
于 2012-12-04T10:33:23.800 に答える