Board logo

標題: Thread-safety & C++ on Win32 [打印本頁]

作者: killuazaoldyeck    時間: 2008-11-9 18:21     標題: Thread-safety & C++ on Win32

如果要讓Class/object可以做到Thread-safety,是否非要用Lock?
Lock-free的有無得基本實現?

我看過好多書都沒具體提及如何實作Class
作者: freewave    時間: 2008-11-9 22:01

请看<<windows核心编程>> 第8章"用户方式中线程的同步"和第9章"线程与内核对象的同步"

简单的保护数据你可以使用CriticalSection.
For example:
CRITICAL_SECTION lock; //定义一把锁
InitializeCriticalSection(&lock); //初始化锁

EnterCriticalSection(&lock); //获得互斥锁
//put the operations here
//the code here may be accessed by multi thread
//and multi thread are synchronized and willn't damage the data
LeaveCriticalSection(&lock);//释放互斥锁
作者: freewave    時間: 2008-11-9 22:04

There are some win32 api you can find on msdn website:
CreateMutex
WaitForSingleObject
WaitForMultipleObjects
作者: killuazaoldyeck    時間: 2008-11-11 01:10

原帖由 freewave 於 2008-11-9 22:01 發表
请看 第8章"用户方式中线程的同步"和第9章"线程与内核对象的同步"
沒錯的話,英文版就是那本非常厚的Windows via C/C++(5th ed.)?
不過效率如何?
只是想修改object的時候Lock,讀取的時候不lock,這樣性能會不會好點
作者: afroken    時間: 2008-11-11 02:35

原帖由 killuazaoldyeck 於 2008-11-11 01:10 發表
沒錯的話,英文版就是那本非常厚的Windows via C/C++(5th ed.)?
不過效率如何?
只是想修改object的時候Lock,讀取的時候不lock,這樣性能會不會好點


you can try google "c++ reader writer lock"
作者: freewave    時間: 2008-11-11 18:52

原帖由 killuazaoldyeck 於 2008-11-11 01:10 發表
沒錯的話,英文版就是那本非常厚的Windows via C/C++(5th ed.)?
不過效率如何?
只是想修改object的時候Lock,讀取的時候不lock,這樣性能會不會好點


【原 书 名】 Programming Applications for Microsoft Windows Fourth Edition  
【原出版社】 Microsoft Press  
【作  者】(美)Jeffrey Richter [同作者作品]  

书的详细可以查阅 http://www.china-pub.com/131

一般来说, 对数据的读、写都需要加锁。 因为读操作还没有完成的时候,写线程可能已经修改了数据。 书里面讲的都是Windows提供的同步方法, 效率没有问题。
For example:
class ProtectedDataReaderWriter
{
protected:
CRITICAL_SECTION lock;
public:
ProtectedDataReaderWriter()
{
InitializeCriticalSection(&lock);
}

~ProtectedDataReaderWriter()
{
DeleteCriticalSection(&lock);
}
void Read(.....)
{
EnterCriticalSection(&lock);
//read data here
LeaveCriticalSection(&lock);
}

bool Write(....)
{
EnterCriticalSection(&lock);
//write data here
LeaveCriticalSection(&lock);
}
}

[ 本帖最後由 freewave 於 2008-11-11 18:55 編輯 ]
作者: killuazaoldyeck    時間: 2008-11-12 01:15

原帖由 freewave 於 2008-11-11 18:52 發表
【原 书 名】 Programming Applications for Microsoft Windows Fourth Edition  
【原出版社】 Microsoft Press  
【作  者】(美)Jeffrey Richter [同作者作品]   

這本書第五版已經改名成Windows via C/C++
我也順帶查過MSDN,似乎只能用WinAPI,而沒有辦法在C RunTime Library找到對應Function...
作者: thinkpanda    時間: 2008-11-12 09:36

原帖由 killuazaoldyeck 於 2008-11-12 01:15 發表

這本書第五版已經改名成Windows via C/C++
我也順帶查過MSDN,似乎只能用WinAPI,而沒有辦法在C RunTime Library找到對應Function...


Multithreading is not part of standard C/C++ library. If you need portability, you may want to look at "pthread".
作者: freewave    時間: 2008-11-12 12:51

原帖由 killuazaoldyeck 於 2008-11-12 01:15 發表

這本書第五版已經改名成Windows via C/C++
我也順帶查過MSDN,似乎只能用WinAPI,而沒有辦法在C RunTime Library找到對應Function...


oh, hehe, 我只看过第四版的。
c runtime library可以使用_beginthread创建线程,但是不能够进行同步。
如果需要编写可移植的代码, 可以使用boost
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread
作者: killuazaoldyeck    時間: 2008-11-15 01:06

原帖由 thinkpanda 於 2008-11-12 09:36 發表
Multithreading is not part of standard C/C++ library. If you need portability, you may want to look at "pthread".
原帖由 freewave 於 2008-11-12 12:51 發表
如果需要编写可移植的代码, 可以使用boost
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread

目標還是Win32,所以暫時不考慮portability。

看過關於OOP with Thread-safety的文章不多,Google好多次都無想知的部分。

Synchronization API / CRT擴充的這些Function,使用在Class/Template的methods中,或Thread同時存取Object過程中,讓性能和Thread-safety獲得平衡?
另,若希望Object可以Copy-on-Write,情況是否更加複雜

p.s.記得CriticalSection好似只能應用在single-process的程式……
Spin-Lock在Single-processor效率又不高

[ 本帖最後由 killuazaoldyeck 於 2008-11-15 01:32 編輯 ]
作者: freewave    時間: 2008-11-16 21:19

原帖由 killuazaoldyeck 於 2008-11-15 01:06 發表


目標還是Win32,所以暫時不考慮portability。

看過關於OOP with Thread-safety的文章不多,Google好多次都無想知的部分。

Synchronization API / CRT擴充的這些Function,使用在Class/Template的methods中,或Thr ...


1、我觉得Windows platfom上高效的线程同步实现都是基于Win32同步API的,即使是可以可移植的代码(例如boost)也是通过条件编译使用了Win32的API。

2、Critical Section只能用在single-process synchronization,如果需要multi-process synchronization,就需要使用Mutex或者Event,主要涉及到的Win32 API有CreateMutex,WaitForSingleObject。具体如何使用请参考MSDN。

3、多线程的程序,首先要保证运行正确,其次才能求效能。 多线程程序设计的效能问题注意点有很多,最主要的就是协调各线程的运行, 一个线程执行完读写受保护数据的代码后需要立刻释放其占用的锁(即锁定区域要尽可能的小), 这样其它的线程就不需要等待太长时间。 Critical section只能用在single-process synchronization,执行效率相对于Mutex要高。

4、copy-on-write 不知道你说的应用场景如何。 一般是数据被多个线程共享,这些线程大部分情况下不修改该数据,一个线程需要修改该数据时,就将该数据copy一份作为修改线程的私有数据,所做的修改不影响公共数据,不会影响到其他的线程。 实现到底困难与否, 与使用的场景有关系。





歡迎光臨 電腦領域 HKEPC Hardware (https://www.hkepc.com/forum/) Powered by Discuz! 7.2