Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455090
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:56:36

学习多线程之三:线程同步--使用互斥
作者:



互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过CMutex来完成线程间的互质,即:CMutex Mutext;

从而我们可以这样来定义数据对象:

#include "afxmt.h"

class CDataArray
{
private:
	int iArray[10];
    CMutex Mutex;
public:
    CDataArray(){};
    ~CDataArray(){};

    void SetData(int iValue);
    void GetDataArray(int aArray[10]);
};
成员函数实现如下:
void CDataArray::SetData(int iValue)
{
	CSingleLock SingleLock(&Mutex);
	SingleLock.Lock();
	for (int i=0;i<10;i++)
		iArray[i]=iValue;
}

void CDataArray::GetDataArray(int aArray[10])
{
	CSingleLock SingleLock(&Mutex);
	SingleLock.Lock();
	for (int i=0;i<10;i++)
		aArray[i]=iArray[i];
}
为了访问一个互斥对象,务必建立一个CSingleLock或CMultiLock对象,用于访问控制。如果互斥没有被线程占用,那么当前的调用线程可以成为互斥的占用者。要实现对互斥的访问,就要调用CSingleLock的成员函数Lock(),即:
SingleLock.Lock();
如果一个线程占用了互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制。
释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。CDataArray的成员函数在退出时,将自动进行解锁操作。因为CSingleLock被创建在椎栈上,系统自动完成对UnLock()的调用。

本文即本人在学习多任务多线程过程的手记,供大家参考,望能得到各位指点。
作者信箱:devvy@21cn.com


--------------------next---------------------

绝对同步,下面是我自己添加测试的代码
UINT Thread_ReadProc(LPVOID param)
{
int aArray[10];
for (int i=0;i<20;i++)
{
DataArray.GetDataArray(aArray);
char str[255];
str[0]=0;
for (int j=0;j<10;j++)
{
int len=strlen(str);
wsprintf(&str[len],"%d",aArray[j]);
}
TRACE1("%s\n",str);
}
return 0;
}
void CDataArray::SetData(int iValue)
{
CSingleLock SingleLock(&Mutex);
SingleLock.Lock();
for (int i=0;i<10;i++)
{
iArray[i]=iValue;
TRACE1("set i = %d\n", iValue );
::Sleep(2000);
}
}
这两个函数经过修改了,延时加长,就可以清楚的看到结果
( fosky 发表于 2006-6-23 16:46:00)
 
绝对同步,下面是我自己添加测试的代码
UINT Thread_ReadProc(LPVOID param)
{
int aArray[10];
for (int i=0;i<20;i++)
{
DataArray.GetDataArray(aArray);
char str[255];
str[0]=0;
for (int j=0;j<10;j++)
{
int len=strlen(str);
wsprintf(&str[len],"%d",aArray[j]);
}
TRACE1("%s\n",str);
}
return 0;
}
void CDataArray::SetData(int iValue)
{
CSingleLock SingleLock(&Mutex);
SingleLock.Lock();
for (int i=0;i<10;i++)
{
iArray[i]=iValue;
TRACE1("set i = %d\n", iValue );
::Sleep(2000);
}
}
这两个函数经过修改了,延时加长,就可以清楚的看到结果
( fosky 发表于 2006-6-23 16:45:00)
 
1楼那个更逗,怎么不把机箱型号也写出来 ( hexiyajin 发表于 2006-5-8 12:06:00)
 
绝对同步,你们怎么测的,虽然我不是lz,但是用眼睛看这么简单的代码也是同步的啊。 ( hexiyajin 发表于 2006-5-8 12:05:00)
 
我真不明白.它的4篇文章至少有2,3篇都有错误,代码根本无法实现同步.竟然还能被选中进入知识库?
( greenjava 发表于 2005-7-11 13:04:00)
 
你自己测试一下同步吗?

我测试了一下,结论:不同步
测试环境:
Windows XP SP2
内存:256M
CPU:2.4G ( 不要只做技术 发表于 2005-3-9 13:47:00)
 
.......................................................

--------------------next---------------------

阅读(366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~