相关疑难解决方法(0)

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

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

linux windows multithreading pthreads

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

是否有与Windows手动重置事件等效的UNIX/pthreads?

简而言之,手动重置事件是同步构造,其处于"发信号"或"非信号"状态.在信号状态中,任何调用事件上的等待函数的线程都不会阻塞,执行将继续不受影响.在非信号对象上调用等待函数的任何和所有线程都将阻塞,直到事件进入信号状态.

信号和非信号状态之间的转换仅在显式调用SetEvent和ResetEvent等函数时发生.

我在Windows上构建了一个同步机制,它使用这些手动重置事件和它们的自动重置兄弟.自动复位机制可以很容易地用信号量复制,但我很难找到手动复位变体的等价物.

特别是,虽然具有"全部通知"功能的条件变量乍一看可能看起来相似,但是当您考虑它需要关联的互斥锁时,它具有相当不同(可能是非功能性)的行为.首先,在线程可以在condvar上等待之前,它必须获取相关的互斥锁.除了获取和释放互斥锁的成本之外,这不必要地序列化所有即将等待的线程.在唤醒时,即使通知所有线程,一次只有一个线程实际上会获得互斥锁,从而产生额外的性能和并发性惩罚,因为在这种情况下互斥锁没有用处.

多CPU系统的发布情况特别差,因为所有服务员同时发布可以保证condvar和Windows事件之间的差异是可观察的 - 使用一个事件,N个线程将在N CPU系统上运行,并且可以并行运行,而使用condvar - 即使是避免雷鸣般的群体的实现 - 线程也只能通过相关的互斥锁一次泄漏.

任何指向更好地模仿手动重置事件行为的构造的指针都将非常感激.我能找到的最接近的是一个屏障 - 这允许不同步的方法和多个线程释放到屏障 - 但屏障"基于等待线程计数"而不是显式应用程序调用"中断",这是我需要的.

linux concurrency multithreading mutex pthreads

7
推荐指数
1
解决办法
2346
查看次数

在Win32中是否有一个C++交叉平台"命名事件,如"CreateEvent()"?

我正在寻找类似于Win32世界中的CreateEvent(),SetEvent()和WaitForMultipleObjects()的东西.

具体而言,这必须可以在同一台机器上的进程之间访问.

我们已经在使用Poco进行一些跨平台的工作,但我没有看到Poco :: Event就是我想要的.也许我错过了什么.

编辑:

解释我想做什么:

我希望进程B知道进程A中何时发生了什么.这在win32中是微不足道的 - 每个进程/线程都调用带有事件名称的CreateEvent().当事情发生时,进程B调用waitForXObject()并且进程A调用SetEvent().B发出信号.

再次,这在win32中是微不足道的,但如何跨平台做到这一点.

c++ events signals cross-platform

7
推荐指数
1
解决办法
5076
查看次数

提升Windows事件的等效性

在windows c ++中,我可以创建一个事件句柄

句柄h = CreateEvent(...)

然后我可以设置并重置该事件

SetEvent(...)和ResetEvent(...)

最后,我可以使用命令OpenEvent(...)来打开OpenEvents

对事件有什么促进作用吗?

c++ windows boost

7
推荐指数
1
解决办法
8120
查看次数