类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
主线程里要对一个缓从区进行平繁(1秒更新一次)赋值,工作者线程读取缓从区值,并发到网上去。
我现在在工作者线程里用到CRITICAL_SECTION来同步,只是不知道在主线程里还用同步吗?
例如:
// 临界区结构对象
CRITICAL_SECTION g_cs;
// 共享资源
char g_cArray[10];
UINT ThreadProc(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
if(flag)
{
send(g_cArray[i]);
Sleep(1);
}
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
……
void CSample08View::OnCriticalSection()
{
// 初始化临界区
InitializeCriticalSection(&g_cs);
// 启动线程
AfxBeginThread(ThreadProc, NULL);
SetTimer(1,1000,NULL);
}
void CSample08View::OnTime(..)
{
EnterCriticalSection(&g_cs);//这一对同步要加吗? 为什么?
for (int i = 0; i < 10; i++)
{
g_cArray[i] = a+rand();
}
LeaveCriticalSection(&g_cs);
}
网友回答:
当然要了,如果不加同步,你线程发送g_cArray的时候,你的主线程很有可能正在修改呢。
当然都需要同步了
当然需要同步.
建议用CCriticalSection+CSingleLock
同步同步,当然是多个线程之间的同步了哟。
在每一个进程里要同步的变量前都要加上 CRITICAL_SECTION ,不然的话根本达不到同步的目的!
进程在执行到进入CRITICAL_SECTION 时会做一个检查,看有没有别的进程在占用这个临界区变量,如果被占用就等待直到被释放,然后继续执行!
主线程一般不要阻塞,否则会阻塞整个进程的
同步是需要的
关于那个问题期待高人的回答
Zengbp():
在每一个进程里要同步的变量前都要加上 CRITICAL_SECTION ,不然的话根本达不到同步的目的!
进程在执行到进入CRITICAL_SECTION 时会做一个检查,看有没有别的进程在占用这个临界区变量,如果被占用就等待直到被释放,然后继续执行!
=========================================================================
这里提到“等待”,既然主线程会等待,说明主线程会死咯????
学习!
所有需要操作共享数据的线程都需要申请进入临界区,closehandle不需要。
在下觉得如果应用了多线程就不必用定时器了!在多线程同步问题上我觉得只要多个线程访问了共享数据并且有冲突的可能就需要同步。大体我觉得应该设置一个同步信号,在工作者线程检测信号,如果有信号可以继续处理,处理完成后发送消息给主线程,主线程处理共享数据时将信号设成无信号完成处理发送信号。工作者线程可以用等待事件函数等待,这样就达到了同步的目的了!等待函数好像是:WaitForSingleObject().