社区
进程/线程/DLL
帖子详情
文件的读写互斥实现有好想法的进!
lxhvc
2004-01-06 11:56:54
课程设计要做一个文件系统的读写进程互斥,不知如何下手,请教高手指点!
具体要求,随机产生读或写进程,做到:
1。“写-写”互斥
2。 “读-读”允许
3。 “读-写”互斥
...全文
372
4
打赏
收藏
文件的读写互斥实现有好想法的进!
课程设计要做一个文件系统的读写进程互斥,不知如何下手,请教高手指点! 具体要求,随机产生读或写进程,做到: 1。“写-写”互斥 2。 “读-读”允许 3。 “读-写”互斥
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
vcforever
2004-01-07
打赏
举报
回复
下面是我写的一个简单的三个线程同时写一个文件的例子
1、在对话框的头文件中定义如下函数和变量
static unsigned __stdcall ThreadThird(LPVOID lparam);
static unsigned __stdcall ThreadTwo(LPVOID lparam);
static unsigned __stdcall ThreadOne(LPVOID lparam);
unsigned hThreadOneId;
unsigned hThreadTwoId;
unsigned hThreadThirdId;
HANDLE hThread[3];
CStdioFile file;
HANDLE hMutex;
2、在OnInitDialog()中打开一个文件,用于三个线程同时写入
//打开文件
if(!file.Open("C:\\test.txt",CFile::modeRead | CFile::modeWrite))
file.Open("C:\\test.txt",CFile::modeRead | CFile::modeWrite | CFile::modeCreate);
3、在一个按钮函数中启动三条线程
//按钮函数
//start three thread
void CMultithreadDlg::OnBtnstart()
{
hMutex = ::CreateMutex(NULL,FALSE,NULL);
hThread[0] = (HANDLE)_beginthreadex(NULL,0,ThreadOne,this,0,&hThreadOneId);
hThread[1] = (HANDLE)_beginthreadex(NULL,0,ThreadTwo,this,0,&hThreadTwoId);
hThread[2] = (HANDLE)_beginthreadex(NULL,0,ThreadThird,this,0,&hThreadThirdId);
WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
for(int i = 0; i < 3; i++)
CloseHandle(hThread[i]);
ReleaseMutex(hMutex);
CloseHandle(hMutex);
MessageBox("all thread finished!\n and Mutex has released success",
"Notice",
MB_ICONINFORMATION | MB_OK);
}
下面是三个线程函数,用于向文件中写入数据
//第二条线程
unsigned __stdcall CMultithreadDlg::ThreadTwo(LPVOID lparam)
{
CMultithreadDlg *pSDlg = (CMultithreadDlg*)lparam;
pSDlg->file.SeekToEnd();
for(int i = 10; i < 20; i++){
WaitForSingleObject(pSDlg->hMutex,INFINITE);
char temp[10] = {0};
itoa(i,temp,10);
strcat(temp,"\n");
pSDlg->file.WriteString(temp);
ReleaseMutex(pSDlg->hMutex);
}
return 0;
}
//第三条线程
unsigned __stdcall CMultithreadDlg::ThreadThird(LPVOID lparam)
{
CMultithreadDlg *pTDlg = (CMultithreadDlg*)lparam;
pTDlg->file.SeekToEnd();
for(int i = 20; i < 30; i++){
WaitForSingleObject(pTDlg->hMutex,INFINITE);
char temp[10] = {0};
itoa(i,temp,10);
strcat(temp,"\n");
pTDlg->file.WriteString(temp);
ReleaseMutex(pTDlg->hMutex);
}
return 0;
}
在对话框关闭的时候关闭文件
void CMultithreadDlg::OnClose()
{
file.Close();
CDialog::OnClose();
}
上面只是一个简单测试多条线程向同一文件中同时写入时的同步,读文件的方法和写的一样,只要处理好同步就可以了!
希望对楼主有所帮助!
sharkhuang
2004-01-07
打赏
举报
回复
solaris和java现在都支持写优先多读单写锁!完全符合你的要求!呵呵
Semigod
2004-01-07
打赏
举报
回复
其实在Windows平台下,打开文件时,只要是ShareRead方式打开就可以像你所说的那样操作了,系统会自动实现你所谓的互斥功能的
victor_cui
2004-01-07
打赏
举报
回复
这是一个典型的读写锁实现的案例,对于unix或者linux平台,我们可是使用phtread_rwlock_t来实现线程间的互斥锁,配合共享内存就可以实现进程间互斥了
而对于windows平台则可以通过内核对象Mutex或者信号量实现自己的读写锁。
这样就可以把你的文件操作和读写锁封装在一起,实现一个你自己的文件操作类了
实现
互斥
的几种方案
本文探讨了在多处理器环境下
实现
进
程
互斥
的多种方法,包括忙等待、屏蔽中断、锁变量、严格轮换法、Peterson解法、TSL指令以及睡眠与唤醒策略。通过具体的例子和代码解释,展示了这些方法如何防止竞态条件,并分析了各自的优缺点,特别是在多核系统中面临的挑战。最后,通过生产者-消费者问题阐述了睡眠与唤醒原语在解决同步问题中的应用及其潜在的竞争条件和解决方案。
linux内核
互斥
技术,Linux内核中的
互斥
之我见
本文详细探讨了Linux内核中的
互斥
机制,包括semaphore和spinlock的不同应用场景及其
实现
原理。针对不同内核执行路径(如
进
程、中断、bottom_half等),介绍了如何选择合适的
互斥
手段。
Qt多线程编程之线程的同步和
互斥
本文介绍了Qt中的多线程同步技术,包括线程同步基础、
互斥
量QMutex、
互斥
锁QMutexLocker、条件变量QWaitCondition、
读写
锁QReadWriteLock以及信号量QSemaphore的使用,通过示例详细解析了如何在多线程环境中确保数据安全。
谈谈在Bitcask中用
读写
锁
实现
并发控制的性能表现
文章讨论了nutsdb数据库在并发控制中使用
读写
锁的
实现
,并分析了为何有人认为这种方式可能不够理想。作者提出,尽管
读写
锁可能导致写操作时的
互斥
,但在考虑磁盘IO的影响时,
读写
锁的性能并不一定比MVCC(多版本并发控制)差很多。通过实验对比,在不同
读写
操作比例下,两者性能差异在读操作占比较高时较为明显,但随着写操作增加,差距减小。文章指出,对于像bitcask这样的存储引擎,由于
读写
都需要涉及磁盘,因此IO往往是更大瓶颈,
读写
锁可能是更实际的选择。
linux python
读写
文件
互斥
,python 并发编程 多
进
程
互斥
锁 目录
本文涵盖EasyUI
实现
工地领款单项目的环境搭建过程,包括引入jar包、配置SpringMVC.web.xml等内容,并探讨了WPF与RDLC报表结合的方法。此外还涉及了Linux C编程资源、Android模拟器命令等技术细节。
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章