|
|
1
7
您需要创建自动重置事件而不是手动重置事件。这样可以保证,如果多个线程在等待一个事件,并且在设置该事件时,只释放一个线程。所有其他线程将保持等待状态。您可以通过向的第二个参数传递false来创建自动重置事件。 CreateEvent 应用程序编程接口。另外,请注意,此代码不是异常安全的,即在锁定缓冲区之后,如果某些语句引发异常,则关键部分将不会被解锁。使用 RAII 确保关键部分即使在异常情况下也能解锁的原则。 |
|
|
2
5
您可以使用信号量对象而不是通用事件对象。每次调用add时,信号量计数都应初始化为0,并以releaseSemaphore递增1。这样,get中的waitForsingleObject将永远不会释放比缓冲区中的值更多的线程来读取缓冲区。 |
|
|
3
3
您必须始终为事件发出信号但没有数据的情况编写代码,即使使用自动重置事件也是如此。从waitForSingleEvent唤醒到调用lockBuffer,都存在一个争用条件,在此间隔内,另一个线程可以从缓冲区中弹出数据。代码必须将waitForSingleEvent放入循环中。随着在每个循环迭代中已经花费的时间减少超时… 作为替代方案,我可以让您对更具可扩展性和性能的替代方案感兴趣吗? Interlocked Singly Linked Lists ,OS线程池 QueueUserWorkItem 和 idempotent 处理。添加 pushes 进入列表并提交工作项的条目。工作项目 pops 一个条目,如果不为空,则处理它。您可以使用花哨的、额外的逻辑,让处理器循环并保持一个状态,标记其“活动”状态,这样添加就不会产生不必要的工作项,但这不是严格要求的。对于更高的SCLAE和多核/多CPU负载分布,我建议使用排队完成端口。这些细节在Rick Vicik的文章中有描述,我有一个博客条目可以同时链接所有3个站点: High Performance Windows programs . |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |