在乙個大型的應用系統中,往往需要多個程序相互協作,程序間通訊(ipc,inter process communication)就顯得比較重要了。在linux系統中,有很多種ipc機制,比如說,訊號(signal)、管道(pipe)、訊息佇列(message queue)、訊號量(semaphore)和共享記憶體(shared memory)、套接字(socket)等,其實windows作業系統也支援這些東西。在ibm的developerworks發現了一篇關於windows與linux 之間ipc機制api比較的文章,寫得很不錯,鏈結
下面大部分內容是關於這些機制的api的實現。
程序的建立可以呼叫createprocess函式,createprocess有三個重要的引數,執行程序的名稱、指向startupinfo結構的指標、指向process_information結構的指標。其原型如下:
bool createprocess
(lptstr lpcommandline,
lpsecurity_attributes lpprocessattributes。
lpsecurity_attributes lpthreadattributes,
bool binherithandles,
dword dwcreationflags,
lpvoid lpenvironment,
lpctstr lpcurrentdirectory,
lpstartupinfolpstartupinfo,
lpprocess_informationlpprocessinformation
);
給個例子,如果啟動時應用程式帶有命令列引數,程序將輸出命令列引數,並建立乙個不帶任何引數的子執行緒;如果不帶有任何引數,則會輸出一條提示訊息。
#include #include #include using namespace std;
int _tmain(int argc, _tchar* argv)
closehandle(writepipe);
return 0;
}unsigned int __stdcall stage2(void * param)
return 1;
} volatile long counter=2;
unsigned int __stdcall test(void *)
return 0;
} int _tmain(int argc,_tchar* argv)
執行緒本地分配可以呼叫__declspec、tlsalloc()等函式。tlsalloc可以分配全域性索引,該索引由所有執行緒共享,但是每個執行緒儲存在索引中的資料為呼叫的執行緒私有,也就是說其他執行緒看不到持有的值。當不再需要全域性索引提供執行緒本地儲存時,可以呼叫tlsfree來釋放全域性索引。
給個例子。
#include #include #include #include using namespace std;
dword tlsindex;
void setdata(int value)
{ cout<<"thread "《還有個問題,就是優先順序的問題。執行緒的優先順序越高,獲得的cpu資源(時間)就越多。在有些情況下,調整乙個應用程式中不同執行緒的優先順序會非常有用。比如說,當某個應用執行乙個長時間的後台任務時,為了保證機器的高響應性,這個後台任務最好以低優先順序執行。
windows作業系統中提供了相關的api。
#include #include #include #include #include using namespace std;
unsigned int __stdcall fastthread(void *data)
{ double d=1.0;
cout<<"fast thread started"<
有時候調整執行緒的優先順序會帶來優先順序反轉的問題。
主要實現了windows作業系統中ipc的api,主要有程序之間共享記憶體、子程序中繼承控制代碼、互斥量、管道、套接字等。此外,還有windows中的互鎖函式。執行緒本地化儲存(tls)、執行緒的優先順序等。
python多程序通訊
這是看書筆記 python提供了多種程序通訊的方式,比如說queue,pipe,value array等。其中queue主要用來在多個程序之間實現通訊。pipe常用來在兩個程序之間實現通訊。queue是多程序安全佇列,queue通過put和get方法來實現多程序之間的資料傳遞。put方法用於將資料插...
多程序TCP通訊
include include include include include include include include include intcreate worker int cli fd else if pid 0 int ret recv cli fd,buff,1024,0 if r...
python多程序通訊
python 多程序實現 from multiprocessing import import time import os class clockprocess process def init self,interval self.interval interval process.init s...