急!!!高手请进,来者有分,我的分多的是,解决问题送分400,多线程的互斥关于mutex的使用

AaronLiu 2003-02-21 10:29:37
我有一全局数组,多个线称访问,在多个地方不同的函数里对该数组进行读写,我现在用mutex量实现,由于我必须保证从windows顺利移植到unix环境下运行,我现在用的是标准的c编写的软件,希望高手给出方案或是源码什么的,谢谢
...全文
58 21 打赏 收藏 转发到动态 举报
写回复
用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)

15,471

社区成员

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

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