请教简单的变量读取和写入的线程同步问题。。

xychzh 2010-07-27 04:55:31

// 线程函数,处理消息循环用的
DWORD WINAPI MessageLoop(LPVOID lpParameter)
{
while (1)
{
string text = g_Edit.GetText();

EnterCriticalSection(&g_cs); // 进入临界区
g_Edit.SetText("测试");
LeaveCriticalSection(&g_cs); // 离开临界区

Sleep(16);
}
}


我想问,一般的变量读取需不需要进行同步??
仅仅在对变量进行写入操作时,加入同步处理,如何???


PS:我对线程不是很熟悉,有认识上的误区还望指出
...全文
89 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xychzh 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aamaomao 的回复:]
也可以这样做,自定义消息后面的参数可以带你的数据,主线程接收你的自定义消息,在消息处理函数中修改变量数据
[/Quote]

我问的不是这个,
而且,我的程序不是你想象的那样。
我的消息系统是自己写的,是用来处我的GUI的。因为我要在消息系统中处理各种事件,比如连接服务器,这些东西用线程,程序才不会被阻塞,所以,这个消息处理线程,就会经常修改一些主线程的数据,比如设置某个窗口控件为显示,比如设置某个静态文本的值,等等。。
aamaomao 2010-07-27
  • 打赏
  • 举报
回复
也可以这样做,自定义消息后面的参数可以带你的数据,主线程接收你的自定义消息,在消息处理函数中修改变量数据
xychzh 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aamaomao 的回复:]
我想你的需求应该是在线程中向主窗口中写提示消息吧
可以向主窗口发送自定义消息,这样用操作系统来负责消息同步
SendMessage(hWnd,WM_USER+xxx,0,pMsgStr);
用这样的方式试试
[/Quote]

不是,我就是需要在线程中修改主线程中的变量数据。。
aamaomao 2010-07-27
  • 打赏
  • 举报
回复
我想你的需求应该是在线程中向主窗口中写提示消息吧
可以向主窗口发送自定义消息,这样用操作系统来负责消息同步
SendMessage(hWnd,WM_USER+xxx,0,pMsgStr);
用这样的方式试试
xychzh 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aamaomao 的回复:]
一个线程中可以多次调用EnterCriticalSection而不停止的,临界区保证的是多个线程之间的同步[/Quote]

那不用临界区,用哪一个同步?
aamaomao 2010-07-27
  • 打赏
  • 举报
回复
msdn上的
After a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. The thread enters the critical section each time EnterCriticalSection and TryEnterCriticalSection succeed. A thread must call LeaveCriticalSection once for each time that it entered the critical section.

一个线程中可以多次调用EnterCriticalSection而不停止的,临界区保证的是多个线程之间的同步
xychzh 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bragi523 的回复:]
这要看是什么变量,如果复杂的是要同步,如果只是一个int等不做同步也可以
[/Quote]

EnterCriticalSection(&g_Critical_Section); // 进入临界区
g_pGUIManager->GetWnd(CTL_TempWnd_01_Text)->SetText("服务器连接失败,请检查网络!");
LeaveCriticalSection(&g_Critical_Section); // 离开临界区

奇怪了,我这里明明锁定了资源,结果运行的时候,程序照样中断,中断的地方就是主线程渲染这个文本的地方。
想不明白。为什么这样
aamaomao 2010-07-27
  • 打赏
  • 举报
回复
这个要看你的变量是否存在多人访问并修改的问题,如果是只读,可以不同步,但是修改数据的话要保证同步,不然系统行为就很诡异了
bragi523 2010-07-27
  • 打赏
  • 举报
回复
这要看是什么变量,如果复杂的是要同步,如果只是一个int等不做同步也可以

15,466

社区成员

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

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