ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程和关键部分使用 – C.

2019-07-26 13:15:14  阅读:198  来源: 互联网

标签:critical-section c multithreading winapi visual-studio-2008


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

解决方法:

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

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

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

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

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

标签:critical-section,c,multithreading,winapi,visual-studio-2008
来源: https://codeday.me/bug/20190726/1544637.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有