相关疑难解决方法(0)

在Linux中等效的WaitForSingleObject和WaitForMultipleObjects

我正在将一个applciation从windows迁移到linux.我面临着关于WaitForSingleObjectWaitForMultipleObjects接口的问题.

在我的应用程序中,我生成多个线程,其中所有线程等待来自父进程的事件或每隔t秒定期运行.

我已经检查过pthread_cond_timedwait,但我们必须为此指定绝对时间.

我怎样才能在Unix中实现它?

c linux multithreading porting synchronization

27
推荐指数
2
解决办法
4万
查看次数

将windows手动重置事件移植到Linux?

如果设置或取消设置事件,是否有更简单的解决方案将窗口手动重置事件移植到pthread,而不是pthread条件变量+ pthread互斥+标记?

linux windows multithreading pthreads

13
推荐指数
3
解决办法
2万
查看次数

通知另一个线程数据可用的最快方法是什么?任何纺纱的替代品?

我的一个线程将数据写入循环缓冲区,另一个线程需要尽快处理此数据.我想写这么简单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允许以下内容:

  1. 更容易使用.
  2. 在占用较少CPU资源的同时,延迟大致相同(甚至更好)?

我认为我的模式非常普遍,某些地方应该有一些好的实现.

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)

c++ multithreading

8
推荐指数
1
解决办法
6342
查看次数

在RedHat Enterprise Linux 5.3之上不能正确支持sem_timedwait?

我们在使用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框上使用gcc 4.1.2进行64位构建(使用-L/usr/lib64和-lstdc ++ -lrt)并在64位安装的RHEL5上运行它可以正常工作
  • 如果我在RHEL5.1框上使用gcc 4.1.2进行32位构建(使用-L/usr/lib和-lstdc ++ -lrt)并在完全相同的64位RHEL5框上运行它,我们会收到来自的ENOSYS错误sem_timedwait

因此,它似乎是RHEL5.4上的64位和32位运行时库之间的区别(看起来似乎是RHEL5.3).唯一的另一个区别是32位和64位版本分别由RHEL5.1和RHEL5.4框完成.

c linux semaphore pthreads rhel5

5
推荐指数
1
解决办法
3422
查看次数