Bootstrap

c++多线程笔记3 线程同步机制

线程同步机制


由于线程共享同一进程的内存空间,多个线程可能需要同时访问同一个数据。如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。
常用的几种同步机制:

全局变量、临界区(critical section)、信号量(simphore)、互斥量(mutex)、管程(monitor)

1 全局变量

全局变量:进程中的所有线程均可以访问所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。

全局变量使用举例:

#include<stdio.h>
#include <windows.h>
bool threaddone=false;
DWORD WINAPI helloFunc(LPVOIDarg)
printr("Hello Thread\n");o
return 0;
main()
{
HANDLE hThread= CreateThread(NULL,0, helloFunc, NULL,0,
NULL);
while(threaddone);
}
//举例二,在这个例子里面主线程一直运行直到附线程执行一次改变全局变量。
#include "stdafx.h"
#include <windows. h>
#include <iostream>
using namespace std;
int globalvar=false:I/同步全局变量
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
 cout<<"ThreadFunc"<<endl;
 Sleep(200);
 Beep(5000,2000)
 globalvar= true;
 return 0;
 }
int main()
{
HANDLE hthread=CreateThread(NULL,0, ThreadFunc,NUL,0,NULL);//创建新线/
if(hthread)
  {
    cout<<"Thread Create Error!"<<endl;
    CloseHandle(hthread);
  }
while(lglobalvar)
    cout<<"Thread while"<<endl;//主线程运行
cout<<"Thread exit"<<endl;
return 0;
}

2 临界区(critical section)

临界区同步:临界区是指包含有共享资源的一段代码块,而且这些共享资源和多个线程之间都存在相关关系。临界区也成为同步块,每个临界区都有一个入口点和一个出口点。在进行临界区同步时,多个线程对临界区资源的访问只能有一个,线程停留在临界区,此时其他的线程将被挂起。

使用临界区的原则:
每次只允许一个线程处于它的临界区(CS)中
若有多个线程同时想进入CS,应在有限时间内让其中一个线程进入CS,以免阻塞
线程在CS内只能逗留有限时间;
不应使要进入CS的线程无限期地等待在CS之外;
在CS之外的线程不可以阻止其他进程进入CS;
不要

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;