一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。一个进程内线程独有栈,其他的堆、静态区、代码区为所有线程共享。
windows_线程_同步(侯捷Win32多线程程序设计)临界区(仅限进程内的各个线程使用)、互斥量(可以跨越多个不同进程的线程)、信号量/信号灯(Semaphore)、事件(Event)
windows_进程_同步 互斥量(限制单个线程访问),信号量/信号灯(同时可有n个访问,每访问一个n--,没释放一个n++),事件
windows_通信:管道(匿名、命名),邮槽,共享内存, socket
Linux_线程_同步:互斥量,条件变量,读写锁,信号量/信号灯,信号(int signo)
Linux_进程_同步:信号量/信号灯 记录锁 特例:信号
Linux_进程间_通信(IPC:APUE第15章节): 管道,消息队列,信号量,共享内存, socket
Linux_进程间_通信(IPC:UNP 卷2):消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名共享内存)及远程过程调用(Solaris 门、Sun RPC)
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
实现:
windows:
临界区
CRITICAL_SECTION g_cs
InitializeCriticalSection(&cs);
EnterCriticalSection(&g_cs);
LeaveCriticalSection(&g_cs);
DeleteCriticalSection(&cs);
互斥量 本身必须释放
thread:
WaitForSingleObject(hMutex, INFINITE);
...
ReleaseMutex(hmutex);
main
hmutex=CreateMutex(NULL, FALSE, "mutex_test");
WaitForMultipleObjects(2,threadidarray,TRUE,INFINITE)
WaitForMultipleObjects(2, hmutex, TRUE, INFINITE); 等待互斥量对象
CloseHandle(hmutex);
信号量
HANDLE hSe = CreateSemaphore(NULL, INIT_RUNNUM, MAX_RUNNUM, "semaphore_test");
OpenSemaphore
DWORD dw=WaitForSingleObject(hSe, INFINITE);
ReleaseSemaphore(hSe, 1, NULL);
CloseHandle(hSe);
事件
DWORD dw=WaitForSingleObject(hEvent, INFINITE);
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
OpenEvent
SetEvent(hEvent);
CloseHandle(hEvent);
linux:
互斥量
pthread_mutex_init
pthread_mutex_lock(&hmutex);
pthread_mutex_unlock(&hmutex);
信号量/信号灯
sem_t sem;
sem_init(&sem,0,1); //2nd==0为进程内线程共享,否则为进程间
sem_wait(&sem);
sem_post (&sem);
sem_destroy (&sem);
sem_timedwait(&sem,&ts);
/*
struct timespec ts;
ts.tv_sec=20+time(NULL);//20s
ts.tv_nsec=0;
*/
信号
临界区
CRITICAL_SECTION g_cs
InitializeCriticalSection(&cs);
EnterCriticalSection(&g_cs);
LeaveCriticalSection(&g_cs);
DeleteCriticalSection(&cs);
互斥量 本身必须释放
thread:
WaitForSingleObject(hMutex, INFINITE);
...
ReleaseMutex(hmutex);
main
hmutex=CreateMutex(NULL, FALSE, "mutex_test");
WaitForMultipleObjects(2,threadidarray,TRUE,INFINITE)
WaitForMultipleObjects(2, hmutex, TRUE, INFINITE); 等待互斥量对象
CloseHandle(hmutex);
信号量
HANDLE hSe = CreateSemaphore(NULL, INIT_RUNNUM, MAX_RUNNUM, "semaphore_test");
OpenSemaphore
DWORD dw=WaitForSingleObject(hSe, INFINITE);
ReleaseSemaphore(hSe, 1, NULL);
CloseHandle(hSe);
事件
DWORD dw=WaitForSingleObject(hEvent, INFINITE);
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
OpenEvent
SetEvent(hEvent);
CloseHandle(hEvent);
linux:
互斥量
pthread_mutex_init
pthread_mutex_lock(&hmutex);
pthread_mutex_unlock(&hmutex);
信号量/信号灯
sem_t sem;
sem_init(&sem,0,1); //2nd==0为进程内线程共享,否则为进程间
sem_wait(&sem);
sem_post (&sem);
sem_destroy (&sem);
sem_timedwait(&sem,&ts);
/*
struct timespec ts;
ts.tv_sec=20+time(NULL);//20s
ts.tv_nsec=0;
*/
信号
待查:自旋锁
参考资料:APUE UNP
UNIX
http://hi.baidu.com/yzkuang/blog/item/990383fdd9d48542d7887dcf.html