请教线程同步的问题

lemon_wei 2005-12-01 04:14:56
没有测试环境,故来请教一下,大家说说这样做有同步效果吗?
就是一个CRITICAL_SECTION 在不同线程中多次保护几个不同的变量,比如在线程A中正在执行g_a=10;
线程b的g_b=21能不能执行?
另外推荐点对同步讲得比较深的参考资料吧,很多书在讲同步时都是浅浅地讲一下。

线程A
{
EnterCriticalSection(&g_cs);
g_a = 10;
LeaveCriticalSection(&g_cs);

EnterCriticalSection(&g_cs);
g_b = 11
LeaveCriticalSection(&g_cs);
}

线程B
{
EnterCriticalSection(&g_cs);
g_b = 21;
LeaveCriticalSection(&g_cs);

EnterCriticalSection(&g_cs);
g_a = 20;
LeaveCriticalSection(&g_cs);
}
...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gohappy_1999 2005-12-08
  • 打赏
  • 举报
回复
临界区只能被多个线程互斥访问,任何时候最多允许一个线程访问临界区
baojian88888 2005-12-08
  • 打赏
  • 举报
回复
不好意思,上面写反了,应该是这样:

线程A
{
EnterCriticalSection(&g_cs1);
g_a = 10;
LeaveCriticalSection(&g_cs1);

EnterCriticalSection(&g_cs2);
g_b = 11
LeaveCriticalSection(&g_cs2);
}

线程B
{
EnterCriticalSection(&g_cs2);
g_b = 21;
LeaveCriticalSection(&g_cs2);

EnterCriticalSection(&g_cs1);
g_a = 20;
LeaveCriticalSection(&g_cs1);
}
baojian88888 2005-12-08
  • 打赏
  • 举报
回复
哦,我理解错楼主的意思了
按照楼主的写法,g_a=10; 和 g_b=21 是不能同时执行的

但是是可以做到同时执行的
对g_a和g_b设置两个不同的临界区

这样写就可以了:
线程A
{
EnterCriticalSection(&g_cs1);
g_a = 10;
LeaveCriticalSection(&g_cs1);

EnterCriticalSection(&g_cs2);
g_b = 11
LeaveCriticalSection(&g_cs2);
}

线程B
{
EnterCriticalSection(&g_cs1);
g_b = 21;
LeaveCriticalSection(&g_cs1);

EnterCriticalSection(&g_cs2);
g_a = 20;
LeaveCriticalSection(&g_cs2);
}
ShiGang 2005-12-08
  • 打赏
  • 举报
回复
临界区和互斥量是一样的.只不过临界区不能跨进程共享访问,并且所创建成的线程结束时,自动会释放信号.

你的那代码好像多此一举,为何这样写不更简单明了吗?
线程A
{
EnterCriticalSection(&g_cs);
g_a = 10;
g_b = 11
LeaveCriticalSection(&g_cs);
}

线程B
{
EnterCriticalSection(&g_cs);
g_b = 21;
g_a = 20;
LeaveCriticalSection(&g_cs);
}

这样就可以有效保护g_a,g_b不能同时被改写了.
lemon_wei 2005-12-08
  • 打赏
  • 举报
回复
多谢,知道了。
CodeProject-Jerry 2005-12-03
  • 打赏
  • 举报
回复
临界区的意思就是这样 看OS教程

多个的话用PV量
freemme 2005-12-03
  • 打赏
  • 举报
回复
不能,因为你是用一个互斥变量g_cs,当你执行EnterCriticalSection的时候,如果没有执行LeaveCriticalSection,该变量保护的临界区就不能被别的地方访问。这里你可以使用不同的互斥变量。
lemon_wei 2005-12-03
  • 打赏
  • 举报
回复
up, 一直没搞懂。
baojian88888 2005-12-02
  • 打赏
  • 举报
回复
在线程A中正在执行g_a=10;
线程b的g_b=21能不能执行?
-----------
不能执行??
我觉得可以执行吧

g_a和g_b是两个不同的资源阿,为什么不行?
如果有两个共享的变量,应该设置两个临界区

难道我理解错了?关注一下
贵子潘 2005-12-01
  • 打赏
  • 举报
回复
在线程A中正在执行g_a=10;
线程b的g_b=21能不能执行?
---------------------------
不能执行。

可以看Win32多线程程序设计,讲得还是比较清楚的
xtuzi 2005-12-01
  • 打赏
  • 举报
回复
没有测试环境,故来请教一下,大家说说这样做有同步效果吗?
-->有效果。但是意义何在?

比如在线程A中正在执行g_a=10;
线程b的g_b=21能不能执行?
--->不能

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧