社区
进程/线程/DLL
帖子详情
急!!!高手请进,来者有分,我的分多的是,解决问题送分400,多线程的互斥关于mutex的使用
AaronLiu
2003-02-21 10:29:37
我有一全局数组,多个线称访问,在多个地方不同的函数里对该数组进行读写,我现在用mutex量实现,由于我必须保证从windows顺利移植到unix环境下运行,我现在用的是标准的c编写的软件,希望高手给出方案或是源码什么的,谢谢
...全文
58
21
打赏
收藏
急!!!高手请进,来者有分,我的分多的是,解决问题送分400,多线程的互斥关于mutex的使用
我有一全局数组,多个线称访问,在多个地方不同的函数里对该数组进行读写,我现在用mutex量实现,由于我必须保证从windows顺利移植到unix环境下运行,我现在用的是标准的c编写的软件,希望高手给出方案或是源码什么的,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chenjiming
2003-02-23
打赏
举报
回复
不过要安全就一定要用OS提供的例程,我说的方法在嵌入式编程里常用
chenjiming
2003-02-23
打赏
举报
回复
//下面代码什么意思?
TimeUp = GetCurrentTime() + TIMEWAIT;
while(TimeUp < GetCurrentTime())
{
if(mutex == 1)
成功并返回;
}
if(超时)
报错;
-----------------------
这是超时处理,防止死锁
demetry
2003-02-23
打赏
举报
回复
good
ensionhower
2003-02-22
打赏
举报
回复
是否可以做个这样的函数来专门处理数组的操作呢?
void doarray()
{
LockArray();
//作你的数组操作
UnLockArray();
}
为了,你的多线程互斥访问,那么要添加互斥变量HANDLE mutex(全局的)
然后你的加锁函数这么写
void LockArray()
{
#ifdef WIN32 //定义程序运行windows
mutex = CreateMutex(0,false,0);
WaitForSingleObject(mutex);
#else //运行与unix
...... //很不好意思,unix还正在学习,不知道应该怎么写他的原语
#endif
}
void UnLockArray()
{
#ifdef WIN32
ReleaseMutex(mutex);
#else
.......
#endif
};
要想移植的话那就必须知道你想要执行的操作系统的原语才可以。这种互斥的原子访问咱们编程好象是实现不了的。
wangjx71
2003-02-22
打赏
举报
回复
up
flyycyu
2003-02-22
打赏
举报
回复
up
pandix
2003-02-21
打赏
举报
回复
学习!
core
2003-02-21
打赏
举报
回复
#ifdef WIN32
#define DECLARE_MUTEX(var) HANDLE var
#define INITIALIZE_MUTEX(var) var = CreateMutex(0, FALSE, 0)
#define MUTEX_LOCK(var) WaitForSingleObject(var, INFINITE)
#define MUTEX_UNLOCK(var) ReleaseMutex(var)
#define MUTEX_DESTROY(var) CloseHandle(var)
#else
#define DECLARE_MUTEX(var) pthread_mutex_t var
#define INITIALIZE_MUTEX(var) pthread_mutex_init(&(var), 0)
#define MUTEX_LOCK(var) pthread_mutex_lock(&(var))
#define MUTEX_UNLOCK(var) pthread_mutex_unlock(&(var))
#define MUTEX_DESTROY(var) pthread_mutex_destroy(&(var))
#endif
仅供参考(unix下好象没有windows的WaitForMultiObjects的功能)
AaronLiu
2003-02-21
打赏
举报
回复
to :aetherstone(太空石)
如何封装成pv操作,能写一点代码吗?与普通函数有什么区别
aetherstone
2003-02-21
打赏
举报
回复
TO: AaronLiu(放不稳的鸡蛋)
//下面代码什么意思?
TimeUp = GetCurrentTime() + TIMEWAIT;
while(TimeUp < GetCurrentTime())
{
if(mutex == 1)
成功并返回;
}
if(超时)
报错;
chenjiming 使用这中“替代”的办法来减少多线程同时操作的可能性,注意只是能“减少”几率而已,并不能避免。
rtdb
2003-02-21
打赏
举报
回复
TO 楼主:
我们的意思是你要先写个加锁的类(若是C, 就是加锁和解锁两个函数)。
然后, 所有的要访问共享数据时,
加锁函数Lock()
访问共享数据
解锁函数Unlock()
这样当你移到不同系统时, 这些CODE都不用动,
只要换那个加锁和解锁函数就可以了。
楼主似乎从JAVA过来的。
C语言中没有自动对数据加锁的方法。
aetherstone
2003-02-21
打赏
举报
回复
同意 rtdb(东临碣石):
建议使用PV原语操作。
建议用标准C函数格式封装PV原语操作做自定义的函数,即使到了不同操作系统下面只需重写此函数
BYTE Lock(void){
#ifdefine WIN
.....
#endif
#ifdefine LINUX
.....
#endif
}
AaronLiu
2003-02-21
打赏
举报
回复
to:chenjiming(还不够聪明) (
valotile int mutex = 1;//是全局变量吗?
.......
.......
.......
//下面代码什么意思?
TimeUp = GetCurrentTime() + TIMEWAIT;
while(TimeUp < GetCurrentTime())
{
if(mutex == 1)
成功并返回;
}
if(超时)
报错;
//////
mutex = 0;//占用mutex
......
.....我访问的数组是否放在这里?......
mutex = 1;//释放mutex
chenjiming
2003-02-21
打赏
举报
回复
楼上说的有道理,但是unix的原语我不知
而且,如果是多处理器的话,我想就必须使用系统提供的操作了
这么说,就只能#ifdef #else #endif 了
rtdb
2003-02-21
打赏
举报
回复
楼上虽然是个简单方法, 但无法保证PV原语操作,
也就不能保证安全性。
chenjiming
2003-02-21
打赏
举报
回复
mutex 其实就是初始值为1的semaphore.
semaphore其实就是一个整形变量
好了,现在说做法
valotile int mutex = 1;//初始化mutex
//valotile表示不被编译器优化,这样可以在
//多线程中保证不备缓冲
.......
.......
.......
TimeUp = GetCurrentTime() + TIMEWAIT;
while(TimeUp < GetCurrentTime())
{
if(mutex == 1)
成功并返回;
}
if(超时)
报错;
mutex = 0;//占用mutex
......
.....
......
mutex = 1;//释放mutex
rtdb
2003-02-21
打赏
举报
回复
建议写一个自已的跨平台的CTHREADLOCK类。
接口么Lock(), Unlock()就可以了(如果系统支持,可以多个IsLock())。
在WINDOWS环境中继承MUTEX或关键区,
在UNIX则使用...(不知)。
这样其它部分的程序就不用动了, 只换一下这个类就可以了。
或者在这个类中加入宏定义
#ifdef WINDOWS
#ifdef UNIX
mymmsc
2003-02-21
打赏
举报
回复
我来学习一些
icelight
2003-02-21
打赏
举报
回复
互斥锁必须有系统的支持,在应用层无法实现,不信用一千个线程轰炸一下你写的互斥锁,看看安全否。
demetry
2003-02-21
打赏
举报
回复
我觉得要用纯C写,还要移植到UNIX,那么就得自己写代码实现P、V操作和互斥访问。但是要做到最大的重用性,很难,也只能解决楼主的问题,剩下的还要重新编写
加载更多回复(1)
王道408操作系统汇总(上)
悟已往之不见,知
来者
之可追
CSDN回帖得分大全(近两年)
√vs2005调用dll的时候Initialize()函数返回错误 [VC/MFC 基础类] 40 ylongwu 05-21 20:486 ylongwu06-28 13:42管理√为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] 40 chencheng8095 05-23 00:2911 xianglitian06-10 11:51管理√CFileFind::FindFile 支持通配符么? [VC/MFC 基础类] 100 wysbk002 05-22
史上最全Java面试题(带全部答案)
今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临...
windows类书的学习心得
原文地址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 内容如下: 创建人: paul 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔
转:经典论文翻译导读之《Google File System》
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 经典论文翻译导读之《Google File System》 2013/03/26 | 分类:...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章