问一个CRITICAL_SECTION(临界区域)的问题,我菜,不要见怪....

睡在床板下_ 2006-09-30 04:08:01
有如下程序:
#include<iostream.h>
#include <afxwin.h>
DWORD WINAPI Write(LPVOID);
DWORD WINAPI Read(LPVOID);
CRITICAL_SECTION gCriticalSection;

int main()
{
HANDLE thread[2];
InitializeCriticalSection(&gCriticalSection);

DWORD threadid;
int arry[100];
for(int i=0;i<100;i++)
arry[i]=i;
thread[0]= CreateThread(NULL,0,Write, (LPVOID)arry,0,&threadid);
thread[1]= CreateThread(NULL,0,Read,(LPVOID)arry,0,&threadid);

WaitForMultipleObjects(2,thread,TRUE,INFINITE);
DeleteCriticalSection(&gCriticalSection);
return 0;
}
DWORD WINAPI Write(LPVOID lpvoid)
{
EnterCriticalSection(&gCriticalSection);
for(int i=0;i<50;i++)
cout<<*((int *)lpvoid+i)<<endl;
LeaveCriticalSection(&gCriticalSection);
return 0;
}
DWORD WINAPI Read(LPVOID lpvoid)
{
//EnterCriticalSection(&gCriticalSection);
for(int i=50;i<100;i++)
cout<<*((int *)lpvoid+i)<<endl;
//LeaveCriticalSection(&gCriticalSection);
return 0;
}
1:为什么不是 0 1 2 3 ......49 50 ?输出呢? 我已经把Write中的资源索住了啊??
2: 为什么Read函数中加上EnterCriticalSection(&gCriticalSection);
结果就显示正确呢??


...全文
182 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickerliang 2006-09-30
  • 打赏
  • 举报
回复
对不起,描述有偏差,
criticalsection的作用是对访问共享资源的那一段代码进行加锁,但并不是对资源本身加锁,所以你再write那里EnterCriticalSection并不能阻塞read线程对array的访问,而你想在write的时候阻塞read线程,你就应该在read内也要调用EnterCriticalSection,并且那个CriticalSection对象要与write线程调用EnterCriticalSection的是同一个。
rickerliang 2006-09-30
  • 打赏
  • 举报
回复
criticalsection的作用是对多条线程会同时执行的
>>同一段代码<<
进行加锁,例如:
ThreadProc是线程的执行代码,它可以被多条线程执行
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...

// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);

// Access the shared resource.

// 由于这里访问了共享资源,所以要同步各条线程(也就是加入临界区)

// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);

...
}
我不知道lz究竟想达到什么效果
如果你想要01234这样输出,何必要多线程呢?
如果你要实现read write同步,用criticalsection是帮不了你的,这时应该用event
睡在床板下_ 2006-09-30
  • 打赏
  • 举报
回复
可能我理解不对 ,不要 见怪啊~~~
谁能解释一下啊~~
verybigbug 2006-09-30
  • 打赏
  • 举报
回复
我晕。。。

15,471

社区成员

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

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