1、线程同步的机制
多线程的优点:提高了并行性和运行效率,减少等待时间,加快响应时间,减少现实开销。(1)快速切换线程。在同一进程中的多线程共享同一地址空间,因而能使进程快速切换。(2)减少系统(管理)开销。(3)通信容易实现。(4)并发程度提高。(5)节约内存空间
多线程的主要缺点:要考虑资源要求和潜在冲突。
进程同步:指两个以上线程基于某个条件来协调他们的活动。一个线程的执行依赖于另一个协作线程的消息或信号 ,当一个线程没有得到来自另一个线程的消息或信号时则需等待 ,直到消息或信号到达才被唤醒。
windows线程同步机制
(1)使用事件对象(event objects)保持线程同步
HANDLE evRead,evFin;
void readThread(LPVOID param)
{
WaitForSingleObject(evRead,INFINITE);//一直等待,直到出现evRead事件
printf("read...\n");
SetEvent(evFin);
}
void writeThread(LPVOID param)
{
cout<<"write...\n";
SetEvent(evRead);
}
void main(void)
{
evRead=CreateEvent(NULL,FALSE,FALSE,NULL);
evFin=CreateEvent(NULL,FALSE,FALSE,NULL);
-beginthread(readThread,0,NULL);
-beginthread(writeThread,0,NULL);
WaitForSingleObject(evFin,INFINITE);
printf("the program is ending...");
return;
}
(2)使用临界区对象(critical section objects)保持线程同步
多个线程访问同一个临界区的原则: (1)一次最多一个线程能够在临界区内; (2)不能让一个线程无限地留在临界区内 ,否则其它线程没有机会进入该临界区。临界区的一个局限是只能用于在同一进程内线程之间的协调。
(3)使用信号灯(semaphore objects)对象保持线程同步
信号灯是允许一个或多个进程中的多个线程访问一个资源的同步对象。它允许多个线程在同一时刻访问同一资源 ,但要限制在同一时刻访问此资源的最多线程数目。
(4)使用互斥体(mutex)对象保持线程同步
互斥体与临界区相似 ,主要区别在于互斥体可以在多个进程中的线程之间进行协调 ,而临界区只能在一个进程中的多个线程之间进行协调。