在CVI / Labwindows中同步线程

时间:2012-12-04 09:49:41

标签: c multithreading thread-synchronization cvi

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

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

同步此操作的最佳做​​法是什么?优先使用动态数字线程?

修改 我们使用CVI / Labwindows。这提供了一些线程,但主要是通过错误的文档宏。我已经想通了,如何注册线程,启动它们并等待它们完成。

似乎还有创建线程安全变量和锁的工具。但是他们的语法不适合我,所以我想/需要自己构建某种互斥/信号量。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  1. 首先,所有N个工作线程必须进入“准备模式”
  2. 您的刺激线程发送刺激。 (它必须等到所有其他人都准备好了)
  3. 然后所有线程都应该开始工作。
  4. 因此在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
    }