在多线程环境中,其他线程永远无法访问关键部分

时间:2013-06-09 01:10:15

标签: c++ multithreading critical-section

现在我被卡住了,这就是我要做的事情:

  • 创建3个主题:
  • 这3个线程将访问共享的全局资源(向量)

在函数中的某个点(即所有线程都会调用),会有一个Sleep(时间)函数,这使得线程休眠,函数不返回。这是我想要另一个线程 - 线程2,访问和使用该函数,修改全局变量,直到它休眠,所以线程3可以访问该函数,等等......

访问全局变量的“临界区”函数具有未指定的访问时间,它永远不会相同。

最初,主要是我打电话

    InitializeCriticalSection(&m_stCriticalSection);

我尝试的是,当调用此函数时,我立即调用

EnterCriticalSection(&m_stCriticalSection);

然后我修改全局变量ect,然后在睡眠(时间)之前调用

        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;
}

2 个答案:

答案 0 :(得分:0)

“//操纵全局数据”部分中是否存在进程失败的可能性?

如果是这样,那么永远不会调用LeaveCriticalSection(& obj)。

您是否尝试过将调试日志放在LeaveCriticalSection(& obj)之前?

答案 1 :(得分:0)

我认为,使用scoped-helpers会更加错误,这会帮助你再次出现'在EnterCriticalSection()之后和LeaveCriticalSection()之前发生一些异常,以便LeaveCriticalSection()真的永远不会发生'。

你可以在CS附近做一些包装(参见上文)并进行一些跟踪。

另外,我假设收集应用程序转储很容易,并通过WinDbg查看当前线程状态& cs state。