多线程环境下,其他线程永远无法访问临界区

Multi-threaded environment, other threads never get access to critical section

本文关键字:访问 临界区 永远 线程 环境 其他 多线程      更新时间:2023-10-16

现在我被卡住了,这是我想做的:

    创建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状态。