首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CVI/Labwindows中同步线程

在CVI/Labwindows中同步线程
EN

Stack Overflow用户
提问于 2012-12-04 09:49:41
回答 2查看 1.8K关注 0票数 1

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

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

同步这一点的最佳实践是什么?有动态数字线程更好吗?

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

似乎还有创建线程安全变量和锁的工具。但是它们的语法无法实现,因此我希望/需要自己构建某种互斥/信号量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-04 10:33:23

  1. 因此,首先,您的N个工作线程必须进入“就绪模式”。

  1. 你的刺激线发出刺激信号。(它必须等到所有其他的都准备好了)

  1. 那么所有的线程都应该开始工作了。

因此,在1到2之间,您需要一个信号量(初始计数0,最大计数nThreads),它由每个工作线程发出信号一次,然后等待刺激线程N次。

在2到3之间,您还需要同步,因为工作线程应该等待刺激线程发送他的刺激。这也可以通过一个信号量(初始计数0,max计数1)来实现。

刺激的伪代码.线程:

代码语言:javascript
复制
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
}

工作线程的伪代码:

代码语言:javascript
复制
while (1) {
  signal stimulus-semaphore
  wait for this threads semaphore
  do the work to be done after stimulus was sent
}
票数 0
EN

Stack Overflow用户

发布于 2012-12-04 10:06:16

我不知道你是不是那个意思,唯一有多线程的C (ISO和ANSI)版本是C11。这方面没有太多的实现,所以您可能有不同的意思。

在C11中,线程间同步的工具是双重的。一种是经典的线程数据结构,即互斥变量和条件变量,其精神与POSIX线程中同样存在。(信号量只是一个可选的特性。)

C11中用于同步线程的第二个工具是atomic变量。这是一个在POSIX中没有同等功能的特性,但所有现代体系结构都对它进行了本机支持。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13700044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档