多线程和关键部分使用 - C++

Jim*_*ell 3 c++ winapi multithreading critical-section visual-studio-2008

关于在多线程应用程序中正确使用关键部分,我有点困惑.在我的应用程序中,有几个在线程之间共享的对象(一些循环缓冲区和一个串行端口对象).是否应将这些对象的访问权限置于关键部分内,或仅在特定时间进行?我怀疑只是在某些时候,因为当我试图用EnterCriticalSection/ LeaveCriticalSection我包装每次使用时,我遇到了似乎是死锁的情况.您可能有任何见解将不胜感激.谢谢.

Joh*_*ing 6

如果您跨线程共享资源,并且其他一些线程在其他线程写入时读取,那么它必须始终受到保护.

如果不了解更多关于代码的内容,很难提供更多建议,但这里有一些要记住的一般要点.

1)关键部分保护资源,而不是流程.

2)在所有线程中以相同的顺序输入/离开关键部分.如果线程A进入Foo,然后输入Bar,则线程B必须以相同的顺序输入Foo和Bar.如果你不这样做,你可以创建一个种族.

3)进入和离开必须以相反的顺序进行.例如,由于您输入了Foo然后进入了Bar,您必须在离开Foo之前​​离开Bar.如果不这样做,可能会造成死锁.

4)合理地在最短的时间内保持锁定.如果你在开始使用Bar之前已经完成了Foo,那么在抓住Bar之前释放Foo.但是你仍然必须从上面牢记订购规则.在同时使用Foo和Bar的每个线程中,您必须以相同的顺序获取和释放:

  Enter Foo
  Use Foo
  Leave Foo
  Enter Bar
  Use Bar
  Leave Bar
Run Code Online (Sandbox Code Playgroud)

5)如果你只读了99.9%的时间并写了0.1%的时间,不要试图聪明.即使你只是在阅读,你仍然必须进入暴击秒.这是因为当你在阅读过程中时,你不希望写入开始.

6)保持关键部分的细化.每个关键部分应该保护一个资源,而不是多个资源.如果你使关键部分太"大",你可以序列化你的应用程序或创建一组非常神秘的死锁或种族.