我有两个(或多个线程)并行工作。它们的目的是测量硬件设备,它们依赖于外部硬件激励。在执行期间的某个时刻,它们会触发硬件设备并等待激励。但我只有一个刺激装置。
因此线程必须等待,直到每个线程都准备好接收刺激。现在另一个线程(可能是调度主线程)必须触发设备,线程可以继续。
同步此操作的最佳做法是什么?优先使用动态数字线程?
修改 我们使用CVI / Labwindows。这提供了一些线程,但主要是通过错误的文档宏。我已经想通了,如何注册线程,启动它们并等待它们完成。
似乎还有创建线程安全变量和锁的工具。但是他们的语法不适合我,所以我想/需要自己构建某种互斥/信号量。
答案 0 :(得分:0)
我不知道你的意思是,具有多线程的唯一C(ISO和ANSI)版本是C11。没有那么多的实现,所以也许你的意思是不同的。
在C11中,线程之间同步的工具是双重的。一种是经典的线程数据结构,即互斥体和条件变量,它们也存在于POSIX线程中。 (信号量只是一个可选功能。)
C11中同步线程的第二个工具是atomic
个变量。这是一个在POSIX中没有等效功能的功能,但是所有现代架构都支持它。
答案 1 :(得分:0)
因此在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
}