1

我有两个(或更多线程)并行工作。它们的目的是测量硬件设备,它们依赖于外部硬件刺激。在执行过程中的某个时刻,它们触发硬件设备并等待刺激。但我只有一个刺激装置。

因此线程必须等待,直到每个线程都准备好接收刺激。现在另一个线程(可能是调度主线程)必须触发设备并且线程可以继续。

同步这个的最佳实践是什么?最好用动态数线程?

编辑: 我们使用 CVI/Labwindows。这提供了一些线程,但主要是通过不良记录的宏。我已经弄清楚了如何注册线程,启动它们并等待它们完成。

似乎也有创建线程安全变量和锁的工具。但是他们的语法让我望而却步,因此我想/需要自己构建某种互斥体/信号量。

4

2 回答 2

0

我不知道你是不是这个意思,唯一具有多线程的 C(ISO 和 ANSI)版本是 C11。周围没有太多的实现,所以也许你的意思有所不同。

在 C11 中,用于在线程之间进行同步的工具是双重的。一种是经典的线程数据结构,即互斥体和条件变量,其精神与它们也存在于 POSIX 线程中的精神相同。(信号量只是一个可选功能。)

C11 中用于同步线程的第二个工具是atomic变量。这是 POSIX 中没有等效的功能,但所有现代架构都本机支持。

于 2012-12-04T10:06:16.623 回答
0
  1. 所以首先你所有的 N 个工作线程都必须进入“就绪模式”
  2. 您的刺激线程发送刺激。(它必须等到所有其他人都准备好)
  3. 然后所有线程应该开始工作。

因此,在 1 和 2 之间,您需要一个信号量(初始计数 0,最大计数 nThreads),每个工作线程发出一次信号,并由刺激线程等待 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 回答