临界段应用问题

wzswgbx 2010-02-03 09:49:36
为了防止文件读写发生冲突,我用临界段来处理,请问大家这样可以吗
InitializeCriticalSection

EnterCriticalSection()
data.open

data.close

LeaveCriticalSection()

程序中多次这样使用,是否有问题? data是CFILE类
...全文
120 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzswgbx 2010-02-03
  • 打赏
  • 举报
回复
我现在不是一般变量,而是一个文件句柄,可能在操作过程中还有不少其它变量
满衣兄 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wzswgbx 的回复:]
临界段里面是锁了所有当中的变量吗?
[/Quote]
可以这么理解。
//进入临界区
global_CriticalSection.Lock(); //相当于EnterCriticalSection
for(int i = 0;i<256;i++)
{
global_Array[i]=D; // global_Array是要保护的变量
ptr->SetWindowText(global_Array);
Sleep(10);
}
//离开临界区
global_CriticalSection.Unlock(); //相当于LeaveCriticalSection

wzswgbx 2010-02-03
  • 打赏
  • 举报
回复
临界段里面是锁了所有当中的变量吗?
wzswgbx 2010-02-03
  • 打赏
  • 举报
回复
是这样理解,但我还是放心不了,特来问问
满衣兄 2010-02-03
  • 打赏
  • 举报
回复
例子:

//CriticalSection
CCriticalSection global_CriticalSection;

// 共享资源
char global_Array[256];

//初始化共享资源
void InitializeArray()
{
for(int i = 0;i<256;i++)
{
global_Array[i]=I;
}
}

//写线程
UINT Global_ThreadWrite(LPVOID pParam)
{
CEdit *ptr=(CEdit *)pParam;
ptr->SetWindowText("");
//进入临界区
global_CriticalSection.Lock();
for(int i = 0;i<256;i++)
{
global_Array[i]=W;
ptr->SetWindowText(global_Array);
Sleep(10);
}
//离开临界区
global_CriticalSection.Unlock();
return 0;
}

//删除线程
UINT Global_ThreadDelete(LPVOID pParam)
{
CEdit *ptr=(CEdit *)pParam;
ptr->SetWindowText("");
//进入临界区
global_CriticalSection.Lock();
for(int i = 0;i<256;i++)
{
global_Array[i]=D;
ptr->SetWindowText(global_Array);
Sleep(10);
}
//离开临界区
global_CriticalSection.Unlock();
return 0;
}

//创建线程并启动线程
void CCriticalSectionsDlg::OnBnClickedButtonLock()
{
//Start the first Thread
CWinThread *ptrWrite = AfxBeginThread(Global_ThreadWrite,
&m_Write,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
ptrWrite->ResumeThread();

//Start the second Thread
CWinThread *ptrDelete = AfxBeginThread(Global_ThreadDelete,
&m_Delete,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
ptrDelete->ResumeThread();
}

满衣兄 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wzswgbx 的回复:]

如果两个线程同时访问data,则会不会出现一个线程不干了(不读写了)直接跳过这种情况

[/Quote]
好像没理解概念..
临界区保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
zhou1xp 2010-02-03
  • 打赏
  • 举报
回复
不会,第二个线程会在锁定的地方等待
wzswgbx 2010-02-03
  • 打赏
  • 举报
回复
"有问题,data.open 和 data.close 应该不用临界段的,打开一次即可,在读写的时候用临界段就可以了。"

大哥,我频繁读写data的
当然是这样:
InitializeCriticalSection

EnterCriticalSection()
data.open
....
read
...
write
...
data.close

LeaveCriticalSection()



如果两个线程同时访问data,则会不会出现一个线程不干了(不读写了)直接跳过这种情况
ouyh12345 2010-02-03
  • 打赏
  • 举报
回复
把临界区封装成一个类,构筑函数里EnterCriticalSection,析构函数里LeaveCriticalSection
zhou1xp 2010-02-03
  • 打赏
  • 举报
回复
可以的,只要保证你的多线程里面都加了锁就行了
满衣兄 2010-02-03
  • 打赏
  • 举报
回复
有问题,data.open 和 data.close 应该不用临界段的,打开一次即可,在读写的时候用临界段就可以了。
bragi523 2010-02-03
  • 打赏
  • 举报
回复
可以,另外如果中间有退出的情况
也要调用LeaveCriticalSection()

15,467

社区成员

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

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