1. 程式人生 > >C++使用thread類多執行緒程式設計

C++使用thread類多執行緒程式設計

C++11中引入了一個用於多執行緒操作的thread類,簡單多執行緒示例:

#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

void thread01()
{
	for (int i = 0; i < 5; i++)
	{
		cout << "Thread 01 is working !" << endl;
		Sleep(100);
	}
}
void thread02()
{
	for (int i = 0; i < 5; i++)
	{
		cout << "Thread 02 is working !" << endl;
		Sleep(200);
	}
}

int main()
{
	thread task01(thread01);
	thread task02(thread02);
	task01.join();
	task02.join();

	for (int i = 0; i < 5; i++)
	{
		cout << "Main thread is working !" << endl;
		Sleep(200);
	}
	system("pause");
}

輸出:

兩個子執行緒並行執行,join函式會阻塞主流程,所以子執行緒都執行完成之後才繼續執行主執行緒。可以使用detach將子執行緒從主流程中分離,獨立執行,不會阻塞主執行緒:

#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

void thread01()
{
	for (int i = 0; i < 5; i++)
	{
		cout << "Thread 01 is working !" << endl;
		Sleep(100);
	}
}
void thread02()
{
	for (int i = 0; i < 5; i++)
	{
		cout << "Thread 02 is working !" << endl;
		Sleep(200);
	}
}

int main()
{
	thread task01(thread01);
	thread task02(thread02);
	task01.detach();
	task02.detach();

	for (int i = 0; i < 5; i++)
	{
		cout << "Main thread is working !" << endl;
		Sleep(200);
	}
	system("pause");
}
輸出:

使用detach的主執行緒和兩個子執行緒並行執行。

帶參子執行緒

在繫結的時候也可以同時給帶引數的執行緒傳入引數:

#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

//定義帶引數子執行緒
void thread01(int num)
{
	for (int i = 0; i < num; i++)
	{
		cout << "Thread 01 is working !" << endl;
		Sleep(100);
	}
}
void thread02(int num)
{
	for (int i = 0; i < num; i++)
	{
		cout << "Thread 02 is working !" << endl;
		Sleep(200);
	}
}

int main()
{
	thread task01(thread01, 5);  //帶引數子執行緒
	thread task02(thread02, 5);
	task01.detach();
	task02.detach();

	for (int i = 0; i < 5; i++)
	{
		cout << "Main thread is working !" << endl;
		Sleep(200);
	}
	system("pause");
}

輸出跟上例輸出一樣:


多執行緒資料競爭

多個執行緒同時對同一變數進行操作的時候,如果不對變數做一些保護處理,有可能導致處理結果異常:

#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

int totalNum = 100;

void thread01()
{
	while (totalNum > 0)
	{
		cout << totalNum << endl;
		totalNum--;
		Sleep(100);
	}
}
void thread02()
{
	while (totalNum > 0)
	{
		cout << totalNum << endl;
		totalNum--;
		Sleep(100);
	}
}

int main()
{
	thread task01(thread01);
	thread task02(thread02);
	task01.detach();
	task02.detach();
	system("pause");
}

輸出結果(部分):


有兩個問題,一是有很多變數被重複輸出了,而有的變數沒有被輸出;二是正常情況下每個執行緒輸出的資料後應該緊跟一個換行符,但這裡大部分卻是另一個執行緒的輸出。

這是由於第一個執行緒對變數操作的過程中,第二個執行緒也對同一個變數進行各操作,導致第一個執行緒處理完後的輸出有可能是執行緒二操作的結果。針對這種資料競爭的情況,可以使用執行緒互斥物件mutex保持資料同步。

mutex類的使用需要包含標頭檔案mutex:

#include <iostream>
#include <thread>
#include <Windows.h>
#include <mutex>

using namespace std;

mutex mu;  //執行緒互斥物件

int totalNum = 100;

void thread01()
{
	while (totalNum > 0)
	{
		mu.lock(); //同步資料鎖
		cout << totalNum << endl;
		totalNum--;
		Sleep(100);
		mu.unlock();  //解除鎖定
	}
}
void thread02()
{
	while (totalNum > 0)
	{
		mu.lock();
		cout << totalNum << endl;
		totalNum--;
		Sleep(100);
		mu.unlock();
	}
}

int main()
{
	thread task01(thread01);
	thread task02(thread02);
	task01.detach();
	task02.detach();
	system("pause");
}

多執行緒中加入mutex互斥物件之後輸出正常:


相關推薦

C++使用thread執行程式設計

C++11中引入了一個用於多執行緒操作的thread類,簡單多執行緒示例: #include <iostream> #include <thread> #include &l

32-執行--概述+Thread+執行的建立方式(繼承Thread+實現Runnable介面)+Runnable介面+執行的名稱+執行的狀態

一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為

C/C++ Linux下執行程式設計 #include

1.最基礎,程序同時建立5個執行緒,各自呼叫同一個函式 #include <iostream> #include <pthread.h> //多執行緒相關操作標頭檔案,可移植眾多平臺   using namespa

C/C++開發】執行程式設計中的join函式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # codi

C++面向物件執行程式設計》讀後感

開始時間:2010-10-19 結束時間:2010-12-12 閱讀方式:精讀,除附錄部分關於非WIN32系統外的API部分。 圖書介質:掃描PDF 讀後感 用了將近2個月的時間讀完了《C++面向物件多

C++11併發/執行程式設計系列(2)

std::thread詳解 std::thread在標頭檔案<thread>中宣告,因此使用 std::thread 時需要包含 <thread>標頭檔案。 default(1) thread() noexcept;

C++使用thread進行執行程式設計

C++11中引入了一個用於多執行緒操作的thread類,簡單多執行緒示例: #include <iostream> #include <thread> #include <Windows.h> using namespace std; void thread01(

c# multi thread programming ,c# 執行程式設計

使用函式代表(委託)的BeginInvoke()和EndInvoke()方法。可以在新開的執行緒上執行函式,並且在主執行緒得到函式的返回值。 using System; using System.Threading; namespace MultiThread { pub

C#執行程式設計筆記(2.5)-使用CountDownEvent

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace CountDownEvent_Test { class Pr

C#執行程式設計筆記(2.7)-使用ReaderWriterLockSlim

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Collections.Generic; using System.Threading; namespace

Java執行方面的程式設計筆試題(通過繼承Thread啟動執行

/*  * 寫兩個執行緒,一個執行緒列印 1~52,另一個執行緒列印字母A-Z。列印順序為12A34B56C……5152Z。要求用執行緒間的通訊。  * 注:分別給兩個物件構造一個物件o,數字每列印兩

C#執行程式設計筆記(2.1)-使用Mutex

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^Mutex是一種原始的同步方法,其只對一個執行緒授予對共享資源的獨佔訪問using System; using System.Threading; namespac

執行程式設計 c++ /thread(detach,join)/ _beginthreadex

1.標頭檔案引用 #include <thread> 2.std::thread test(&function, this);test.detach(); join:主執行緒被阻塞 detach:,不會阻塞,會分離,子執行緒自動回收資源 _be

C++執行程式設計(執行)

簡述 通過執行緒類來管理執行緒,實現業務邏輯與執行緒管理分離 原始碼 介面類 SFRunnable.h class SFRunnable { public: virtual ~SFRunnable() {}; vi

C#執行程式設計筆記(2.6)-使用Barrier

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace Barrier_Test { class Program

C#執行程式設計筆記(2.8)-使用SpinWait

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace SpinWait_Test { class Program

Java併發程式設計(6):Runnable和Thread實現執行的區別(含程式碼)

Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行

Python實戰之執行程式設計thread模組

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

C/S模式下---執行程式設計

伺服器採用單程序/執行緒程式設計,在同一時刻,伺服器只能與一個客戶端進行互動。只有與當前客戶端的通訊結束後,才能為下一個客戶端進行服務。所以,如果採用執行緒,讓主執行緒連線客戶端,而函式執行緒為每個客戶端進行服務,這樣就可以保證伺服器可以同時為多個客戶端提供服務,實現併發。 採用多執