系统——进程线程,同步与通信



一个标准的线程由线程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;
*/
信号


待查:自旋锁

参考资料:APUE UNP

UNIX

http://hi.baidu.com/yzkuang/blog/item/990383fdd9d48542d7887dcf.html

http://blog.csdn.net/nowdoit/article/details/6449626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值