多线程同步会影响性能,怎么改进这个问题

 我来答
吾不愿意放弃
2016-09-30 · TA获得超过148个赞
知道答主
回答量:234
采纳率:0%
帮助的人:103万
展开全部
写入多线程应用程序时,线程间的同步资源访问是一个常见问题。两个或多个线程同时访问同一数据会导致不合需要的、不可预知的结果。例如,一个线程可能正在更新结构的内容,而另一个线程正在读取同一结构的内容。无法得知读取线程将会收到何种数据:旧数据、新写入的数据或两种数据都有。MFC提供了多个同步和同步访问类以帮助解决此问题。本主题说明了可用的类以及如何在典型的多线程应用程序中使用它们创建线程安全类。典型的多线程应用程序具有代表各个线程间要共享的资源的类。正确设计的完全线程安全类不需要调用任何同步函数。该类的任何事情都在内部处理,使您可以将精力集中于如何更好地使用类,而不是它如何会损坏。创建完全线程安全类的有效技术是将同步类合并到资源类中。将同步类合并到共享类是一个简单的过程。以维护链接的帐户列表的应用程序为例。此应用程序允许在独立的窗口中最多检查三个帐户,但是在任何特定的时间,只能更新一个帐户。更新帐户后,通过网络将更新的数据发送到数据存档。此示例应用程序使用所有这三种类型的同步类。因为它一次最多允许检查三个帐户,所以它使用CSemaphore限制对三个视图对象的访问。当试图查看第四个帐户时,应用程序或者等到前三个窗口中有一个关闭,或者该尝试失败。更新帐户时,应用程序使用CCriticalSection确保一次只更新一个帐户。更新成功后,发出信号CEvent以释放等待该事件信号发送的线程。此线程将新数据发送到数据存档。设计线程安全类若要使类完全线程安全,首先将适当的同步类作为数据成员添加到共享类中。在前面的帐户管理示例中,将CSemaphore数据成员添加到视图类,将CCriticalSection数据成员添加到链接的列表类,将CEvent数据成员添加到数据存储类。下一步,将同步调用添加到修改类中的数据或访问受控资源的所有成员函数中。应该在每个函数中创建CSingleLock或CMultiLock对象,并调用该对象的Lock函数。当锁定对象超出范围并被销毁时,该对象的析构函数调用Unlock以释放资源。当然,如果愿意,可直接调用Unlock。用这种方式设计线程安全类使得在多线程应用程序中使用该类与使用非线程安全类一样容易,但却具有更高的安全级别。将同步对象和同步访问权对象封装到资源的类将提供完全线程安全编程的所有优点,而不会有维护同步代码的缺点。下面的代码示例通过使用在共享资源类和CSingleLock对象中声明的数据成员m_CritSection(CCriticalSection类型),对此方法进行了说明。通过使用m_CritSection对象的地址创建CSingleLock对象,来试图同步共享资源(从CWinThread派生)。试图锁定资源,一旦锁定,即完成了共享对象上的工作。完成工作后,即调用Unlock取消锁定资源。CSingleLocksingleLock(&m_CritSection);singleLock.Lock();//resourcelocked//.usageofsharedresourcesingleLock.Unlock();注意与其他MFC同步类不同的是,CCriticalSection没有计时锁定请求选项。等待释放线程的时间是无限的。此方法的缺点是类将要比没有添加同步对象的相同类慢一些。而且,如果有一个以上的线程可能删除对象,合并方法不一定始终有效。在这种情况下,最好维持单独同步对象。有关确定在不同情况下使用何种同步类的信息,请参见多线程编程:何时使用同步类。有关同步的信息,请参见“PlatformSDK”中的同步。有关MFC中的多线程支持的信息,请参见使用C++和MFC进行多线程编程。请参见概念使用C++和MFC进行多线程编程
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式