在网络编程中多线程是一个必用一种技术,但是在初步时候多线程的时候一些开发者会遇到这样或那样的问题,其实这些问题我个人感觉主要是集中数据和线程同步上。ACE的“锁”机制完全可以解决这些问题。
首先我们讲讲什么是“锁”,在现实中我们需要把一些东西保护起来不让别人使用,我们怎么办呢?这个时候我们会用一个箱子把这些东西锁起来,防止别人使用。线程的“锁”就是把一部分代码保护起来,不要别人访问它,除非我们把箱子打开。

ace的锁主要分三类,“读写锁”“线程锁”“进程锁”。
“读写锁”
ACE_RW_Mutex:在我们对数据进行“读”和“写”的时候保护数据不被其他人读写,说到这里我必须提一下c++中所有的类型如:vector、list、map等都不是安全的,我们在进行多线程编程是要用读写锁来控制这些类型的读写。

首先我们来看看下面这个例子

static ACE_RW_Mutex g_RW_Mutex;

int g_Cout = 0;

DWORD WINAPI Fun1Write1(LPVOID lpParameter)
//thread data
{
//g_RW_Mutex.acquire_write();
 while(g_Cout < 5)
 

  ACE_OS::sleep(
1);//为了突出效果所以我这里暂停一秒
  g_Cout++;
 }

//g_RW_Mutex.release();
 std::cout << "插入完成" <<std::endl;
 
return 0;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 HANDLE hThread1;
 HANDLE hThread2;
 
//创建线程

 hThread1
=CreateThread(NULL,0,Fun1Write1,NULL,0,NULL);
 hThread2
=CreateThread(NULL,0,Fun1Write2,NULL,0,NULL);
 getchar();
 std::cout 
<< g_Cout << std::endl;
 CloseHandle(hThread1);
 CloseHandle(hThread2);
 getchar();
 
return 0;
}



最后g_Count的结果是6.这就是数据同步的问题。
如果我们把注释的地方打开g_Count的结果就是5

为什么g_Count的结果为6就由读者自己来分析吧。
我来解释一下为把注释的地方打开后g_Count的结果会是5:g_RW_Mutex我们可以理解为一个锁
当线程执行到g_RW_Mutex.acquire_write()首先判断这个锁是不是被其他线程获取了,如果没有被其他线程使用,那么其他的线程执行到这里的时候就不能继续执行,除非调用了g_RW_Mutex.release()释放这个锁,那么其他的线程才能继续执行,在其他线程继续执行的时候同样要遵守

posted on 2011-12-31 11:41 arrow8209 阅读(2162) 评论(2)  编辑 收藏 引用
评论
  • # re: ace 锁
    陈梓瀚(vczh)
    Posted @ 2011-12-31 12:23
    加上volatile估计会让你的问题更难重现。而且如果有mutex没有volatile,那9成还是要出错的。所以就这个例子来说,最好的方法是_InterlockedIncrement……  回复  更多评论   
  • # re: ace 锁[未登录]
    arrow8209
    Posted @ 2012-01-03 22:29
    @陈梓瀚(vczh)
    我明白的你的意思。按照上面的例子用你所说的方案当然之最安全的。这篇文章主要是用来讲解ACE中的锁的用法。我是先有ACE的读写锁,在有下面的例子,而这个例子是我随手写的,写的不是很好。请见谅。有时间我在改改  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


统计