社区
进程/线程/DLL
帖子详情
急!!!高手请进,来者有分,我的分多的是,解决问题送分400,多线程的互斥关于mutex的使用
AaronLiu
2003-02-21 10:29:37
我有一全局数组,多个线称访问,在多个地方不同的函数里对该数组进行读写,我现在用mutex量实现,由于我必须保证从windows顺利移植到unix环境下运行,我现在用的是标准的c编写的软件,希望高手给出方案或是源码什么的,谢谢
...全文
81
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)
多线程
同步:
互斥
量
使用
探讨了在
多线程
环境下,如何有效收集各线程数据并安全地添加到数据库的问题。通过
使用
互斥
对象(
Mutex
)进行线程同步,确保了数据的一致性和完整性。
初次
使用
多线程
mutex
编程心得
本文深入探讨了C++11中
多线程
编程的
互斥
锁和条件变量应用,通过生产者消费者模型实例,展示了如何
使用
mutex
和condition_variable确保线程安全,避免竞态条件。
Go
互斥
锁(sync.
Mutex
)和读写锁(sync.RW
Mutex
)性能分析
本文分析了Go中的sync.
Mutex
互斥
锁和sync.RW
Mutex
读写锁的区别,详细解释了读写锁的多读单写特性,以及在不同读写比例下的性能差异。通过实验表明,读写锁在读多写少的场景下能显著提高性能,而在读写比例均衡或写多读少的情况下,性能优势相对较小。同时,介绍了
Mutex
的公平策略,包括正常状态和饥饿状态,以防止长时间等待的goroutine出现尾延迟。
华为LiteOS
互斥
锁-实现
互斥
锁功能-osal_
mutex
_demo
本文详细阐述了
互斥
锁在多任务环境下如何保护共享资源的独占访问,包括其工作原理、
使用
场景及Huawei LiteOS中
互斥
锁的特性。通过实例演示了如何在标准应用中创建、申请和释放
互斥
锁,以及OSAL API的
使用
。
C++线程间的
互斥
和通信
本文深入探讨了
互斥
锁、条件变量及原子类型的原理与应用,通过车站售票等实例,展示了如何解决
多线程
环境下资源竞争与同步问题。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章