多线程如何同步

临界区(CCriticalSection)这玩意儿,说白了就是保护共享资源。
多个线程抢着用同一个资源时,搞个临界区对象。
谁有这个对象谁就能用资源,没对象的线程就得等着。
用完之后,必须把对象还回去,这样别人才能用。

具体咋干呢?先定义个临界区对象,比如g_CriticalSection = CCriticalSection;。
要用共享资源之前,先搞个锁,g_CriticalSection.Lock();。
用完资源了,记得解锁,g_CriticalSection.Unlock();。
就这么简单。

事件(CEvent)这玩意儿,就是线程间发信号。
一个线程干完活,通知另一个线程该干啥了。
比如线程A听网络端口,线程B更新用户数据。
线程A处理完数据,就给线程B发个信号,让线程B开始干。

CEvent对象有两种状态,有信号和无信号。
还有两种类型,自动事件和人工事件。
自动事件,别人用完就自动变无信号。
人工事件,别人用完之后,得手动调ReSet()才变无信号。

举个例子,假设在2 008 年微软的某个系统里,线程A和线程B就用CEvent来通信。
线程A负责处理网络请求,线程B负责写数据库。
线程A处理完请求,就调用CEvent.Set();,线程B看到信号就开始写数据库。
如果用自动事件,线程B写完数据库,CEvent就自动变无信号。
如果用人工事件,线程B得调CEvent.Reset();,不然信号就一直存在。

线程同步的几种方法效率比较

上周。
我和同事讨论线程同步。

线程同步很重要。
不然数据会出错。

比如2 02 3 年1 0月1 5 号, 我们项目就因为没同步, 数据库数据错了三次。

主要有两种方法。
wait() 和 notifyAll()。

wait() 方法。
让线程自己先睡。
释放锁。
这样其他线程可以用。

sleep() 方法。
让线程强制睡。
睡多久自己定。
但是要catch异常。
不然程序会崩溃。

notify() 方法。
叫醒一个睡着的线程。
但是叫谁, JVM说了算。
优先级不重要。

notifyAll() 方法。
叫醒所有睡着的线程。
它们会抢锁。
谁抢到谁用。

我那个朋友问。
为啥要排队? 他说为了公平。
我说为了数据不乱。

这部分我不确定。
是不是所有语言都这样? 好像有点区别。

算了。
你看着办。