没有内核调用的pthread信令

时间:2014-09-08 12:38:44

标签: c++ multithreading pthreads real-time

我在C ++的实时Linux(红鹰)上使用pthreads运行一些线程。所有线程都在固定频​​率循环上运行,其中一个线程将轮询CPU时钟并警告其他两个线程下一个循环已启动(在循环结束时我们可以安全地假设其他循环已完成其任务我正在等待下一个循环。我的目标是尽可能减少延迟,并且我有能力让线程占用它们所占用的CPU的100%(并保证它们是由于红色而在该CPU上运行的唯一东西鹰派增强)。

我这样做的想法是让时间线程轮询cpu tick count直到它达到> X,然后递增64位或32位计数器而不要求互斥锁。其他两个循环将轮询此计数器并等待它增加,也不需要互斥锁。我怎么看它不需要互斥,因为第一个线程可以原子地递增计数器,因为它是唯一写入它的东西。其他两个线程可以毫无顾虑地读取它,因为32位或64位数字可以写入内存而不会成为部分状态(我认为)。

我意识到我的所有线程都会轮询某些东西,因此一直以100%运行,我可以通过使用pthreads信号来减少它,但我相信那里的延迟比我想要的要多。我也知道互斥量大约需要几十纳秒,所以我可能在没有看到延迟的情况下使用它们,但是当我有一个线程增加一个计数器而另外两个轮询它时,我不明白为什么需要它。

2 个答案:

答案 0 :(得分:2)

您需要告诉编译器您的计数器是同步变量。您可以通过声明计数器std::atomic,然后使用其中一个内置运算符(fetch_add()operator++()表示增量,load()作为读取线程来执行此操作。)请参阅http://en.cppreference.com/w/cpp/atomic/atomic

如果您没有声明您的计数器atomic,那么您将进行数据竞争,您的程序没有定义的语义,并且允许编译器(并且可能会)移动代码反试验(这可能会导致您不期望的结果。)

您需要使用c ++ 11来获取std::atomic。在大多数g ++版本中,您使用--std=c++0x标志执行此操作。最新版本的g ++需要--std=c++11标志。

答案 1 :(得分:0)

由于存在共享变量,一个线程修改(递增)和其他访问,最好是在pthread_mutex_lock和pthread_mutex_unlock之间进行换行以确保互斥

相关问题