並發編譯
⑴ 並發編程和多線程編程一樣嗎
並發編程又叫多線程編程。
在程序中,往往有很多很耗時的工作,比如上傳文件、下載文件、跟客戶聊天需要長時間建立連接。這種時候,一個線程是服務不了多個用戶的,會產生因為資源獨占產生的等待問題。
例如:編寫一個耗時的單線程程序:
新建一個基於對話框的應用程序SingleThread,在主對話框IDD_SINGLETHREAD_DIALOG添加一個按鈕,ID為IDC_SLEEP_SIX_SECOND,標題為「延時6秒」,添加按鈕的響應函數,代碼如下:
void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //延時6秒
}
編譯並運行應用程序,單擊「延時6秒」按鈕,你就會發現在這6秒期間程序就象「死機」一樣,不在響應其它消息。為了更好地處理這種耗時的操作,我們有必要學習——多線程編程。
⑵ 如何確定VS編譯器版本
先做profiling確定瓶頸: cpu換multi-core找並發編譯編譯器來用 內存比內存夠導致換頁太多加內存
⑶ maven並發編譯可不可以指定順序
在多模塊的工程中,如果模塊之間存在依賴關系,那模塊的編譯必須要有順序的要求。例如:P(parent)中包含A模塊和B模塊,且A模塊依賴於B模塊,那麼在P中的pom,xml中需申明為:
<moles>
<mole>B</mole>
<mole>A</mole>
</moles>
B需要聲明在A的前面,這樣先編譯後的內容才能被A依賴。
同時,什麼version的時候,只需要在P中申明即可,如${p.version}其他的採用繼承的方式,即在A和B模塊中不申明自己的版本, A中依賴的B同樣使用${P.version}完成。
⑷ 在Go 語言中,如何正確的使用並發
今年的早些時候我們對比過了幾種native編程語言,包括D語言、Go、Rust和Vala。這里我們將分析來自Google的Go語言,看看他到底哪裡跟別的語言不一樣。 Go語言比其他的很多語言都吸引我,雖然我不是Go語言的專家,但是我很樂意在這里介紹一下它的特性,下面的這些特性指引我轉向了Go語言。 快速簡單的編譯: go語言編譯的很快,事實上,他快的甚至可以作為腳本語言了。幾個使他編譯很快的原因有: 他不使用頭文件當A依賴B,B又依賴C時,那麼首先會編譯C,然後是B和A;但是如果A依賴B,但是A並不直接依賴於C,而是存在依賴傳遞,這時會把所有B需要從C拿到的信息放在B的對象代碼里。這樣,當編譯A的時候,就不需要再管C了。在編譯程序時,只需將類型信息沿著依賴關系樹向上遍歷即可,如果到達樹的頂端,則只需編譯緊鄰的依賴,而不用管其它層級的依賴了。通過多返回值的錯誤處理: 現代的編程語言基本上有兩種錯誤處理辦法,例如在C語言里是使用返回值,而在Java等面向對象語言里使用異常處理返回值,因為返回值的狀態碼總是可能跟需要返回的結果有沖突。Go語言允許多返回值,從某種程度上解決了這個問題。你可以為你的函數的執行結果狀態定義返回值,任何調用的時候都可以來檢查,很方便。簡單的組合: 可以使用interface為對象指定一些類型的成員,還可以像Java一樣給他們指定操作(行為)。例如在標准庫的io包中定義了一個Writer,就有一個帶有位元組數組作為參數(輸入)一個integer值和錯誤碼作為返回值(輸出)的方法。而實現了io.Writer介面中的Write方法的類型才是實際被執行的。這個設計能夠非常優雅的分離代碼,還簡化了單元測試過程,例如,如果你想測試一個資料庫對象的一個方法,在傳統的語言中你必須創建一個資料庫對象,然後做很多協議初始化工作。在Go語言中,你可在介面下創建任何對象。簡單的並發: 在Go中並發變得非常的簡單,在任何函數前方上go兩個字母,這個函數就將以他自己的go-routine(一個非常輕量級的線程)來運行,Go- routines之間通過channels來通信。我們通常會有一些需要線程同步和互斥的需求,在Go中非常簡單,Go只是啟動並發任務,各個任務之間通過channels來通信,從而協調同步和互斥。優秀的錯誤提示: 我從沒見過別的語言有Go語言這么高的錯誤診斷質量。例如如果你的程序思索了,Go的運行時可以通知你,而且,他甚至可以告訴你是哪個線程出了問題。當然編譯錯誤也是很詳細很有用的。其他特性:Go語言還有其他非常吸引人的特性:高階函數、垃圾回收、哈希映射、可擴展的數組等等。當然了,沒有一件東西是非常完美的,Go語言的開發工具還非常缺乏,社區很小,但是這個語言的背後支持者是Google,這些問題都會一步一步的解決。當其他語言,尤其是D語言、Rust、Vala旨在簡化C++而且增加新的特性的時候,他們都覺得自己像是帶著新特性的C++。
⑸ C++ 並發 openMP和PPL的for並發
visualstudioexpress選擇點擊立即安裝參考資料:/visualstudio/chs/downloads#d-2012-express可在工程屬性(語言)或者編譯參數(/OpenMP)中啟用OpenMP
⑹ C語言如何創建並發進程
WIN32API函數CreateProcess用來創建一個新的進程和它的主線程,這個新進程運行指定的可執行文件。
函數原型:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_
);參數:
lpApplicationName
指向一個NULL結尾的、用來指定可執行模塊的字元串。
這個字元串可以是可執行模塊的絕對路徑,也可以是相對路徑,在後一種情況下,函數使用當前驅動器和目錄建立可執行模塊的路徑。
這個參數可以被設為NULL,在這種情況下,可執行模塊的名字必須處於 lpCommandLine 參數最前面並由空格符與後面的字元分開。
lpCommandLine
指向一個以NULL結尾的字元串,該字元串指定要執行的命令行。
這個參數可以為空,那麼函數將使用lpApplicationName參數指定的字元串當做要運行的程序的命令行。
如果lpApplicationName和lpCommandLine參數都不為空,那麼lpApplicationName參數指定將要被運行的模塊,lpCommandLine參數指定將被運行的模塊的命令行。新運行的進程可以使用GetCommandLine函數獲得整個命令行。C語言程序可以使用argc和argv參數。
lpProcessAttributes
指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的句柄可以被子進程繼承。如果lpProcessAttributes參數為空(NULL),那麼句柄不能被繼承。
在Windows NT中:SECURITY_ATTRIBUTES結構的lpSecurityDescriptor成員指定了新進程的安全描述符,如果參數為空,新進程使用默認的安全描述符。
lpThreadAttributes
同lpProcessAttribute,不過這個參數決定的是線程是否被繼承.通常置為NULL.
bInheritHandles
指示新進程是否從調用進程處繼承了句柄。
如果參數的值為真,調用進程中的每一個可繼承的打開句柄都將被子進程繼承。被繼承的句柄與原進程擁有完全相同的值和訪問許可權。
dwCreationFlags
指定附加的、用來控制優先類和進程的創建的標志。以下的創建標志可以以除下面列出的方式外的任何方式組合後指定。
⑴值:CREATE_DEFAULT_ERROR_MODE
含義:新的進程不繼承調用進程的錯誤模式。CreateProcess函數賦予新進程當前的默認錯誤模式作為替代。應用程序可以調用SetErrorMode函數設置當前的默認錯誤模式。
這個標志對於那些運行在沒有硬體錯誤環境下的多線程外殼程序是十分有用的。
對於CreateProcess函數,默認的行為是為新進程繼承調用者的錯誤模式。設置這個標志以改變默認的處理方式。
⑵值:CREATE_NEW_CONSOLE
含義:新的進程將使用一個新的控制台,而不是繼承父進程的控制台。這個標志不能與DETACHED_PROCESS標志一起使用。
⑶值:CREATE_NEW_PROCESS_GROUP
含義:新進程將是一個進程樹的根進程。進程樹中的全部進程都是根進程的子進程。新進程樹的用戶標識符與這個進程的標識符是相同的,由lpProcessInformation參數返回。進程樹經常使用GenerateConsoleCtrlEvent函數允許發送CTRL+C或CTRL+BREAK信號到一組控制台進程。
⑷值:CREATE_SEPARATE_WOW_VDM
如果被設置,新進程將會在一個私有的虛擬DOS機(VDM)中運行。另外,默認情況下所有的16位Windows應用程序都會在同一個共享的VDM中以線程的方式運行。單獨運行一個16位程序的優點是一個應用程序的崩潰只會結束這一個VDM的運行;其他那些在不同VDM中運行的程序會繼續正常的運行。同樣的,在不同VDM中運行的16位Windows應用程序擁有不同的輸入隊列,這意味著如果一個程序暫時失去響應,在獨立的VDM中的應用程序能夠繼續獲得輸入。
⑸值:CREATE_SHARED_WOW_VDM
如果WIN.INI中的Windows段的DefaultSeparateVDM選項被設置為真,這個標識使得CreateProcess函數越過這個選項並在共享的虛擬DOS機中運行新進程。
⑹值:CREATE_SUSPENDED
含義:新進程的主線程會以暫停的狀態被創建,直到調用ResumeThread函數被調用時才運行。
⑺值:CREATE_UNICODE_ENVIRONMENT
含義:如果被設置,由lpEnvironment參數指定的環境塊使用Unicode字元,如果為空,環境塊使用ANSI字元。
⑻值:DEBUG_PROCESS
含義:如果這個標志被設置,調用進程將被當做一個調試程序,並且新進程會被當做被調試的進程。系統把被調試程序發生的所有調試事件通知給調試器。
如果你使用這個標志創建進程,只有調用進程(調用CreateProcess函數的進程)可以調用WaitForDebugEvent函數。
⑼值:DEBUG_ONLY_THIS_PROCESS
含義:如果此標志沒有被設置且調用進程正在被調試,新進程將成為調試調用進程的調試器的另一個調試對象。如果調用進程沒有被調試,有關調試的行為就不會產生。
⑽值:DETACHED_PROCESS
含義:對於控制台進程,新進程沒有訪問父進程式控制制台的許可權。新進程可以通過AllocConsole函數自己創建一個新的控制台。這個標志不可以與CREATE_NEW_CONSOLE標志一起使用。
〔11〕值:CREATE_NO_WINDOW
含義:系統不為新進程創建CUI窗口,使用該標志可以創建不含窗口的CUI程序。
dwCreationFlags參數
還用來控制新進程的優先類,優先類用來決定此進程的線程調度的優先順序。如果下面的優先順序類標志都沒有被指定,那麼默認的優先類是NORMAL_PRIORITY_CLASS,除非被創建的進程是IDLE_PRIORITY_CLASS。在這種情況下子進程的默認優先類是IDLE_PRIORITY_CLASS。
可以選擇下面的標志中的一個:
優先順序:HIGH_PRIORITY_CLASS
含義:指示這個進程將執行時間臨界的任務,所以它必須被立即運行以保證正確。這個優先順序的程序優先於正常優先順序或空閑優先順序的程序。一個例子是Windows任務列表,為了保證當用戶調用時可以立刻響應,放棄了對系統負荷的考慮。確保在使用高優先順序時應該足夠謹慎,因為一個高優先順序的CPU關聯應用程序可以佔用幾乎全部的CPU可用時間。
優先順序:IDLE_PRIORITY_CLASS
含義:指示這個進程的線程只有在系統空閑時才會運行並且可以被任何高優先順序的任務打斷。例如屏幕保護程序。空閑優先順序會被子進程繼承。
優先順序:NORMAL_PRIORITY_CLASS
含義:指示這個進程沒有特殊的任務調度要求。
優先順序:REALTIME_PRIORITY_CLASS
含義:指示這個進程擁有可用的最高優先順序。一個擁有實時優先順序的進程的線程可以打斷所有其他進程線程的執行,包括正在執行重要任務的系統進程。例如,一個執行時間稍長一點的實時進程可能導致磁碟緩存不足或滑鼠反映遲鈍。
lpEnvironment
指向一個新進程的環境塊。如果此參數為空,新進程使用調用進程的環境。
一個環境塊存在於一個由以NULL結尾的字元串組成的塊中,這個塊也是以NULL結尾的。每個字元串都是name=value的形式。
因為相等標志被當做分隔符,所以它不能被環境變數當做變數名。
與其使用應用程序提供的環境塊,不如直接把這個參數設為空,系統驅動器上的當前目錄信息不會被自動傳遞給新創建的進程。對於這個情況的探討和如何處理,請參見注釋一節。
環境塊可以包含Unicode或ANSI字元。如果lpEnvironment指向的環境塊包含Unicode字元,那麼dwCreationFlags欄位的CREATE_UNICODE_ENⅥRONMENT標志將被設置。如果塊包含ANSI字元,該標志將被清空。
請注意一個ANSI環境塊是由兩個零位元組結束的:一個是字元串的結尾,另一個用來結束這個快。一個Unicode環境塊是由四個零位元組結束的:兩個代表字元串結束,另兩個用來結束塊。
lpCurrentDirectory
指向一個以NULL結尾的字元串,這個字元串用來指定子進程的工作路徑。這個字元串必須是一個包含驅動器名的絕對路徑。如果這個參數為空,新進程將使用與調用進程相同的驅動器和目錄。這個選項是一個需要啟動應用程序並指定它們的驅動器和工作目錄的外殼程序的主要條件。
lpStartupInfo
指向一個用於決定新進程的主窗體如何顯示的STARTUPINFO結構體。
lpProcessInformation
指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結構體。返回值:
如果函數執行成功,返回非零值。
如果函數執行失敗,返回零,可以使用GetLastError函數獲得錯誤的附加信息。進程的查看、創建和撤銷(C語言)
常式:
#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
intshowallproc()
{
PROCESSENTRY32pe32;//用來存儲進程信息的結構體
pe32.dwSize=sizeof(pe32);
HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//獲取進程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("調用失敗 ");
return1;
}
BOOLbProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
printf("%5d%s ",pe32.th32ProcessID,pe32.szExeFile);//輸出進程ID和進程名
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return0;
}
intcreatproc()
{
charstr[256]={0};
printf("請輸入可執行文件路徑(*.exe): ");
scanf("%s",str);
STARTUPINFOsi={0};
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
PROCESS_INFORMATIONpi;
if(!CreateProcess(NULL,str,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("創建失敗 ");
return-1;
}
else
{
printf("創建成功 ");
printf("進程號:%d ",pi.dwProcessId);
}
return0;
}
intstopproc()
{
DWORDProcessID;
printf("請輸入想要終止的進程ID ");
scanf("%d",&ProcessID);
HANDLEhProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打開對應進程句柄
if(hProcess==NULL)
{
printf("失敗 ");
return-1;
}
if(!TerminateProcess(hProcess,0))//關閉進程
{
printf("關閉失敗 ");
}
else
{
printf("關閉成功 ");
}
CloseHandle(hProcess);
return0;
}
intmain()
{
intn=0;
while(n!=4)
{
printf("1查看進程 ");
printf("2創建進程 ");
printf("3終止進程 ");
printf("4結束 ");
printf("請選擇:");
scanf("%d",&n);
switch(n)
{
case1:
showallproc();
break;
case2:
creatproc();
break;
case3:
stopproc();
break;
case4:
break;
default:
printf("輸入有誤! ");
break;
}
}
return0;
}
⑺ scala並發例子編譯錯誤
actor已經從scala標准庫中移除了,請使用akka的actor
⑻ 為什麼需要使用並發編程什麼時候適合使用並發編程技術
提高計算效率,充分利用計算機性能。
為大數據處理做好准備。