我正在将一个applciation从windows迁移到linux.我面临着关于WaitForSingleObject和WaitForMultipleObjects接口的问题.
在我的应用程序中,我生成多个线程,其中所有线程等待来自父进程的事件或每隔t秒定期运行.
我已经检查过pthread_cond_timedwait,但我们必须为此指定绝对时间.
我怎样才能在Unix中实现它?
如果设置或取消设置事件,是否有更简单的解决方案将窗口手动重置事件移植到pthread,而不是pthread条件变量+ pthread互斥+标记?
我的一个线程将数据写入循环缓冲区,另一个线程需要尽快处理此数据.我想写这么简单spin.伪代码!
while (true) {
while (!a[i]) {
/* do nothing - just keep checking over and over */
}
// process b[i]
i++;
if (i >= MAX_LENGTH) {
i = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
上面我a用来表示存储的数据b可供处理.Probaly我也应该为这种"热"过程设置线程.当然这种旋转在CPU方面非常昂贵,但对我来说这是好的,因为我的主要要求是延迟.
问题是 - 我应该写出类似的东西,boost或者stl允许以下内容:
我认为我的模式非常普遍,某些地方应该有一些好的实现.
upd似乎我的问题仍然太复杂了.让我们考虑一下这种情况,当我需要以任意顺序将一些项目写入数组时,另一个线程应该在项目可用时以正确的顺序读取它们,如何做到这一点?
UPD2
我正在添加测试程序来演示我想要实现的内容和方式.至少在我的机器上它恰好起作用.我rand用来告诉你我不能使用一般queue,我需要使用array-based结构:
#include "stdafx.h"
#include <string>
#include <boost/thread.hpp>
#include "windows.h" // for Sleep
const int BUFFER_LENGTH = 10; …Run Code Online (Sandbox Code Playgroud) 我们在使用pthreads sem_timedwait的RedHat Enterprise Linux系统上看到了奇怪的行为.它只发生在5.3版本之后.
当我们使用sem_init在后台线程上创建信号量时,不会返回任何错误.当我们执行sem_timedwait时,我们立即返回errno = 38(ENOSYS),表明它不受支持.
如果我们在主线程上做同样的事情,它按预期工作,我们从sem_timedwait没有得到任何错误.
我们在RHEL 5.2或之前没有看到它.我们尝试使用gcc 3.2.3和4.1.2编译代码并获得相同的结果,因此它似乎是一个运行时问题.
所以,我的问题(最后;)
1)有没有人见过这个?2)RHEL 5.3以后是否已知问题?3)我们使用sem_timedwait来睡一个线程.Linux上还有哪些替代方法可以做同样的事情?
如果这是另一个问题的副本,请告诉我.我看了但是找不到一个有同样问题的人,只是OSX的类似问题,而不是我们正在使用的问题.
谢谢,pxb
更新:刚刚完成了一些测试,结果如下:
因此,它似乎是RHEL5.4上的64位和32位运行时库之间的区别(看起来似乎是RHEL5.3).唯一的另一个区别是32位和64位版本分别由RHEL5.1和RHEL5.4框完成.