进程与线程之间的关系
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
进程是资源分配的单位,不是调度运行的单位。真正调度运行的基本单位是线程。实现并发功能的单位也是线程。
线程在运行过程中需要同步与互斥,不同进程的线程间要利用进程通信的办法实现同步。
线程是进程中执行运算的最小单位。执行处理机调度的基本单位。
调度与资源分配:线程是系统调度的基本单位。进程是拥有资源的基本单位。
同步机制
线程同步互斥机制:
(1) 临界区 (2)互斥量 (3)信号量 (4) 事件
进程间通信的方式:
(1) 管道 (2) 共享内存 (3) 信号(信号量) (4) 套接字
1、临界区:在某一时刻只有一个线程能访问数据,即在任意时刻只允许一个线程对共享资源进行访问。
CRITICAL_SECTION cs;
InitializeCriticalSection( &cs );
EnterCriticalSection( &cs );
LeaveCriticalSection( &cs );
DeleteCriticalSection( &cs );
2、互斥量:只有拥有互斥对象的线程才具有访问资源的权限。
pthread_mutex_t mutex;
pthread_mutex_init( &mutex, NULL );
pthread_t thread_id[10];
pthread_create( &thread_id[i] , NULL , func_name , NULL );
pthread_join( thread_id[i] ,NULL );
pthread_mutex_lock( &mutex );
pthread_mutex_unlock( &mutex );
3、信号量:允许多个线程同时使用共享资源,但需要限制在同一时刻访问此资源的最大线程数目。
createSemaphore:创建信号量同时指出允许的最大资源计数和当前可用资源计数。
ReleaseSemaphore:将当前可用资源计数加1。
HANDLE gSamephore;
//设置信号量2个资源,同时只可以有两个线程访问
CreateSemaphore( NULL, 2, 2, NULL );
WaitForSingleObject( gSemaphore,INFINITE );
ReleaseSemaphore( gSemaphore,1,NULL );
4、事件:通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。
HANDLE g_hEvent;
g_hEvent = CreateEvent( NULL,FALSE,FALSE,NULL);
WaitForSingleObject( g_hEvent,INFINITE );
SetEvent( g_hEvent );
互斥量、信号量、事件都可以跨越进程来进行同步数据操作
进程通信
进程间通信最常用的方式有:共享内存、管道、信号量等。
共享内存
内存映射文件是通过两个或多个进程映射同一个文件映射对象的视图实现。
CreateFileMapping:创建一个命名的内存映射对象,得到相应内存起始位置指针。
MapViewOfFile:映射对象的一个视图,得到指向映射到内存起始位置的指针并通过该指针读写共享的内存区域。
UnmapViewOfFile:解除视图映射。
OpenFileMapping:打开一个命名的内存映射文件对象。
管道
管道类型:匿名管道、命名管道
CreateNamedPipe:创建命名管道。
ConnectNamePipe
CreateFile:打开命名管道
ReadFile:管道创建后,读取数据
WriteFile:管道创建后,写入数据
信号量
共享文件
用于通信的文件被一个进程打开并向其中写数据,而另外一个进程将文件打开,从里面读数据。
消息机制
进程间通信一般采用用户自定义的消息来完成,也可以使用Windows定义的WM_COPYDATA消息来共享数据。