vc 如何解决多道程序共享数据的问题

vc 如何解决多道程序共享数据的问题,第1张

请问阁下的意思是多个进程共享一个或者多个数据吧,这种情况下必须采用线程同步机制,

下面,笔者罗列集中方式,让您看看吧。

1,关键代码区,亦称作临界区,一般应用于同一进程下不同线程的某一共享数据,

下面采用伪代码

CCriticalSection section//声明临界段

int array[10] //共享变量

Thread A: section.Lock()

array[3] = 2;

//访问, *** 作共享变量

section.Unlock()

Thread B: section.Lock()

array[0] = 3;

//访问, *** 作共享变量

section.Unlock()

int main()

{

AfxBeginThread(mythreadA,NULL)

AfxBeginThread(mythreadB,NULL)

Sleep(10000)

return 1

}

1,互斥量,一般应用于同一进程及不同进程下不同线程的某一共享数据,

handle hmutex = createMutex()

waitforsinglebject(hmutex,infinte)

releasemutex(hmutex)

handle hmutex = createMutex() //声明互斥量

int array[10] /亩码岁/共享变量

Thread A:

waitforsinglebject(hmutex,infinte)//等待线程调度

array[3] = 2;

//访问, *** 作共享变量

releasemutex(hmutex)//释放本处对象,恢复可调度状态

Thread B: waitforsinglebject(hmutex,infinte)//等待线程调度

array[0] = 3;

//访问, *** 作共享变量

releasemutex(hmutex)//释放本处对象,恢复可调度状态

int main()

{

AfxBeginThread(mythreadA,NULL)

AfxBeginThread(mythreadB,NULL)

Sleep(10000)

return 1

}

这个 *** 作和临界区的单独使用的 *** 作是一模一样的。

3,事件对象,用于线程间的相互唤醒。

在VC下,我们用 HANDLE g_Event=CreateEvent(...)创建一个迅睁事件对象,

CreateEvent函数中的有一个参数可以将此事件对象设置为自动重置还是人工重置。

一般在此事件对象相关的线程函数中会有这样的句子

while (TRUE)

{

WaitForSingleObject(g_Event,INFINITE);

。。。

}

就说明这个线程在等待此事件对象的信号,事件对象有两种状态,一种是有信号状态,一种是无信号状态。

当我们用函数SetEvent(g_Event)将事件对象变为有信号状态时,就是你说的事件得到通知,

这个线程的模汪WaitForSingleObject函数就可以继续向下执行,相当于线程进入可调度状态

(本来此线程的程序是卡在这个位置的,相当于不可调度)。

而人工重置与自动重置的区别呢,重置就是将事件对象变成无信号状态,

人工重置就是使用函数ResetEvent(g_Event)将事件对象重置,

而自动重置就是等待函数调用之后事件对象自动成为无信号的,不需人工调用ResetEvent函数。

handle hevent= createevent(0, true/false, 0, 0)

waitforsigleobject(infinite)

(resetevent(hevent)在人工重置的情况下)

..........

setevent(hevent)//如果自动重置下执行一次后不再调用它,线程会一直堵塞;而人工重置不重置下这相当没有加事件对象了

4,CsingleLock,使用它是为了OOP,方便维护

1,)应用时一般用在函数内部,用做类成员有性能缺失,与CCriticalsection有区别

fun()

{

CsingleLock csingle

csingle.lock//不需要解锁了,因为CsingleLock 析构函数自动解锁,一般用在函数内部

dowork

}

5,CSemaphore 通 常 用 于 当 一 个 应 用 程 序 中 同 时 有 多 个 线 程 访 问 一 个 资 源

( 例 如, 应 用 程 序 允 许 对 同 一 个Document 有 多 个View) 的 情 况

共享内存竖和用于进程之间通信,如果是多线程,用全局变量+信号量互斥就可以了呀?

非要用的话,一个进程用shmget创建共享内存区,然后用shmat连接共享内存进行访问

注意要好郑配合信号量互斥,共享内存本身是没有同步机制的友纤颂。

你可以使用网络文件夹耐慧枯的形式共享!昌洞参考资料还有其它方式!

------------------------------

但是我不得不提醒你,你用access最好使用BS程序开发。这样可以达到目的。

或是你改成mysql或是SqlServer等数据库。否则你的文件没事就锁上!

---------------------------------

以前我用小碧碧乌龟共享的方式,结果那个惨呀!该用什么就用什么,别搞特殊,关键时刻掉链子就菜了!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12370078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存