Thread-safety & C++ on Win32

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

我看過好多書都沒具體提及如何實作Class

请看<<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);//释放互斥锁

TOP

There are some win32 api you can find on msdn website:
CreateMutex
WaitForSingleObject
WaitForMultipleObjects

TOP

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

TOP

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


you can try google "c++ reader writer lock"

TOP

原帖由 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 編輯 ]

TOP

原帖由 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...

TOP

原帖由 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".

TOP

原帖由 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

TOP

原帖由 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 編輯 ]

TOP