多线程环境下,其他线程永远无法访问临界区
Multi-threaded environment, other threads never get access to critical section
现在我被卡住了,这是我想做的:
- 创建3个线程
- 这3个线程将访问一个共享的全局资源(一个矢量)
在函数的某一点(所有线程都将调用),将有一个Sleep(time)函数,它使线程休眠,函数不返回。这是我想要另一个线程-线程2,访问和使用函数,修改全局变量,直到它睡觉,所以线程3可以访问函数,等等…
访问全局变量的"临界区"函数有一个未指定的访问时间,它永远不会相同。
最初,在main中我调用
InitializeCriticalSection(&m_stCriticalSection);
我尝试的是,当这个函数被调用时,我立即调用
EnterCriticalSection(&m_stCriticalSection);
然后我修改全局变量,等等,然后在Sleep(time)之前我调用
LeaveCriticalSection(&m_stCriticalSection);
问题是,其他线程永远不会访问该函数,即使我离开它。是否有一种方法,我的其他线程连续,甚至每5秒,获得访问临界区?我的实现还能更好吗?
这就是我现在写的
void function() // all our threads will access this
{
EnterCriticalSection(&obj)
// manipulate global data
LeaveCriticalSection(&obj)
Sleep(long time) // another thread SHOULD NOW have access to this section!
return true;
}
是否有可能在"//操纵全局数据"部分失败?
如果是,那么永远不会调用leaveccriticalsection (&obj)。
你有没有试过把调试日志放在leaveccriticalsection (&obj)之前?
我认为,这是更容易出错的使用范围的帮助,它可以帮助你反对的情况,如'一些异常发生在EnterCriticalSection()和leaveccriticalsection()之前,使leaveccriticalsection()真的从来没有发生'。
你可以在CS周围做一些包装(见上文),并进行一些跟踪。
另外,我认为收集应用程序转储并通过WinDbg查看当前线程状态很容易&cs状态。
相关文章:
- 在同步问题中,弱指针可以代替互斥锁或临界区吗?
- 多线程环境下,其他线程永远无法访问临界区
- 如果一个线程在临界区上调用Acquire(),如果另一个线程调用Release(),该锁会被释放吗?
- 是否需要临界区?
- 当我的堆栈加倍时,它会给我临界区错误!_ctrlvalidHeappointer
- 确定Windows线程是否处于临界区或类似的位置
- 这段代码是一个工作的临界区包装器类吗?
- 临界区通过constexpr
- 临界区队列
- 出乎意料的性能提升与OpenMP临界区
- 如何使用Boost创建临界区?
- 临界区最简单的实现
- 由两个线程访问的共享队列的临界区代码是什么?
- c++ 11有临界区吗?
- 如何避免临界区和SendMessage之间的死锁
- Windows临界区公平性
- 线程同步-临界区或互斥锁
- 是否寄存器读/写需要临界区保护
- 如何在两个类之间共享单个临界区
- 什么是临界区