国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】多線程(thread)使用詳解

這篇具有很好參考價(jià)值的文章主要介紹了【C++】多線程(thread)使用詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

1. 多線程的含義

多線程(multithreading),是指在軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。具有多核CPU的支持的計(jì)算機(jī)能夠真正在同一時(shí)間執(zhí)行多個(gè)程序片段,進(jìn)而提升程序的處理性能。在一個(gè)程序中,這些獨(dú)立運(yùn)行的程序片段被稱為“線程”(Thread),利用其編程的概念就叫作“多線程處理”。

2. 進(jìn)程與線程的區(qū)別

進(jìn)程是指一個(gè)程序的運(yùn)行實(shí)例,而線程是指進(jìn)程中獨(dú)立的執(zhí)行流程。一個(gè)進(jìn)程可以有多個(gè)線程,多個(gè)線程之間可以并發(fā)執(zhí)行。

  • 一個(gè)程序有且只有一個(gè)進(jìn)程,但可以擁有至少一個(gè)的線程。
  • 不同進(jìn)程擁有不同的地址空間,互不相關(guān),而不同線程共同擁有相同進(jìn)程的地址空間。

二、創(chuàng)建線程

1. thread

C++支持多線程編程,主要使用的是線程庫(kù)<thread>。

示例1: 創(chuàng)建線程使用std::thread

#include <iostream>
#include <thread>    //必須包含<thread>頭文件

void threadFunctionA()
{
	std::cout << "Run New thread: 1" << std::endl;
}
void threadFunctionB(int n)
{
	std::cout << "Run New thread: "<< n << std::endl;
}

int main()
{
	std::cout << "Run Main Thread" << std::endl;

	std::thread newThread1(threadFunctionA);
	std::thread newThread2(threadFunctionB,2);

	newThread1.join();
	newThread2.join();

	return 0;
}
//result
Run Main Thread
Run New thread: 1
Run New thread: 2

上述示例中,我們創(chuàng)建了兩個(gè)線程newThread1newThread2,使用函數(shù)threadFunctionA()threadFunctionB()作為線程的執(zhí)行函數(shù),并使用join()函數(shù)等待線程執(zhí)行完成。

示例2: 執(zhí)行函數(shù)有引用參數(shù)

#include <iostream>
#include <thread>    //必須包含<thread>頭文件

void threadFunc(int &arg1, int arg2)
{
	arg1 = arg2;
	std::cout << "arg1 = " << arg1 << std::endl;
}

int main()
{
    std::cout << "Run Main Thread!" << std::endl;
	int a = 1;
	int b = 5;
	std::thread newTh(threadFunc, a, b);  //此處會(huì)報(bào)錯(cuò)
	newTh.join();
	return 0;
}

注意: 若編譯上述代碼,編譯器會(huì)報(bào)如下錯(cuò)誤:

錯(cuò)誤	C2672	“std::invoke”: 未找到匹配的重載函數(shù)
錯(cuò)誤	C2893	未能使函數(shù)模板“unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)”專用化

這是因?yàn)?strong>thread在傳遞參數(shù)時(shí),是以右值傳遞的,如果要傳遞一個(gè)左值可以使用std::refstd::cref

  • std::ref 可以包裝按引用傳遞的值為右值。
  • std::cref 可以包裝按const引用傳遞的值為右值。

因此,示例2代碼可修改為:

#include <iostream>
#include <thread>    //必須包含<thread>頭文件

void threadFunc(int &arg1, int arg2)
{
	arg1 = arg2;
	std::cout << "New Thread arg1 = " << arg1 << std::endl;
}

int main()
{
	std::cout << "Run Main Thread!" << std::endl;
	int a = 1, b = 5;
	std::thread newTh(threadFunc, std::ref(a), b);  //使用ref
	newTh.join();
	return 0;
}
//result
Run Main Thread!
arg1 = 5

2. join() 和 detach()

在C++中,創(chuàng)建了一個(gè)線程時(shí),它通常被稱為一個(gè)可聯(lián)接(joinable)的線程,可以通過(guò)調(diào)用join()函數(shù)或detach()函數(shù)來(lái)管理線程的執(zhí)行。

方法 說(shuō)明
1 join() 等待一個(gè)線程完成,如果該線程還未執(zhí)行完畢,則當(dāng)前線程(一般是主線程)將被阻塞,直到該線程執(zhí)行完成,主線程才會(huì)繼續(xù)執(zhí)行。
2 detach() 將當(dāng)前線程與創(chuàng)建的線程分離,使它們分別運(yùn)行,當(dāng)分離的線程執(zhí)行完畢后,系統(tǒng)會(huì)自動(dòng)回收其資源。如果一個(gè)線程被分離了,就不能再使用join()函數(shù)了,因?yàn)榫€程已經(jīng)無(wú)法被聯(lián)接了。
3 joinable() 判斷線程是否可以執(zhí)行join()函數(shù),返回true/false

示例3:

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

void foo()
{
	std::cout << "Run New thread!\n";
	Sleep(2000);   		//需要頭文件<windows.h>
}

int main()
{
	std::thread t(foo);

	if (t.joinable())
	{
		t.join();  		// 等待線程t執(zhí)行完畢

		// t.detach();  // 分離線程t與主線程
	}

	std::cout << "Run Main thread!\n";
	return 0;
}

在上述的示例中,創(chuàng)建了一個(gè)可聯(lián)接的線程t,使用t.join()主線程將被阻塞,直到t線程執(zhí)行完畢。如果使用t.detach()t線程分離,那么它們將同時(shí)執(zhí)行,主線程將不會(huì)阻塞。

注意:

  • 線程是在thread對(duì)象被定義的時(shí)候開始執(zhí)行的,而不是在調(diào)用join()函數(shù)時(shí)才執(zhí)行的,調(diào)用join()函數(shù)只是阻塞等待線程結(jié)束并回收資源。
  • 分離的線程(執(zhí)行過(guò)detach()的線程)會(huì)在調(diào)用它的線程結(jié)束或自己結(jié)束時(shí)自動(dòng)釋放資源。
  • 線程會(huì)在函數(shù)運(yùn)行完畢后自動(dòng)釋放,不推薦利用其他方法強(qiáng)制結(jié)束線程,可能會(huì)因資源未釋放而導(dǎo)致內(nèi)存泄漏。
  • 若沒(méi)有執(zhí)行join()detach()的線程在程序結(jié)束時(shí)會(huì)引發(fā)異常。

3. this_thread

在C++中,this_thread類提供了一些關(guān)于當(dāng)前線程的功能函數(shù)。具體如下:

使用 說(shuō)明
1 std::this_thread::sleep_for() 當(dāng)前線程休眠指定的時(shí)間
2 std::this_thread::sleep_until() 當(dāng)前線程休眠直到指定時(shí)間點(diǎn)
3 std::this_thread::yield() 當(dāng)前線程讓出CPU,允許其他線程運(yùn)行
4 std::this_thread::get_id() 獲取當(dāng)前線程的ID

此外,this_thread還包含重載運(yùn)算符==!=,用于比較兩個(gè)線程是否相等。

示例4:

#include <iostream>
#include <thread>
#include <chrono>

void my_thread()
{
	std::cout << "Thread " << std::this_thread::get_id() << " start!" << std::endl;

	for (int i = 1; i <= 5; i++)
	{
		std::cout << "Thread " << std::this_thread::get_id() << " running: " << i << std::endl;
		std::this_thread::yield();	// 讓出當(dāng)前線程的時(shí)間片
		std::this_thread::sleep_for(std::chrono::milliseconds(200));  // 線程休眠200毫秒
	}

	std::cout << "Thread " << std::this_thread::get_id() << " end!" << std::endl;
}

int main()
{
	std::cout << "Main thread id: " << std::this_thread::get_id() << std::endl;
	
    std::thread t1(my_thread);
	std::thread t2(my_thread);
	
	t1.join();
	t2.join();
	return 0;
}
//result 程序輸出的結(jié)果可能如下:
Main thread id: 43108
Thread 39272 start!
Thread 33480 start!
Thread 33480 running: 1
Thread 39272 running: 1
Thread 33480 running: 2
Thread 39272 running: 2
Thread 33480 running: 3
Thread 39272 running: 3
Thread 33480 running: 4
Thread 39272 running: 4
Thread 39272 running: 5
Thread 33480 running: 5
Thread 39272 ends
Thread 33480 ends

三、std::mutex

在多線程編程中,需要注意以下問(wèn)題:

  • 線程之間的共享數(shù)據(jù)訪問(wèn)需要進(jìn)行同步,以防止數(shù)據(jù)競(jìng)爭(zhēng)和其他問(wèn)題。可以使用互斥量、條件變量等機(jī)制進(jìn)行同步。
  • 可能會(huì)發(fā)生死鎖問(wèn)題,即多個(gè)線程互相等待對(duì)方釋放鎖,導(dǎo)致程序無(wú)法繼續(xù)執(zhí)行。
  • 可能會(huì)發(fā)生競(jìng)態(tài)條件問(wèn)題,即多個(gè)線程執(zhí)行的順序?qū)е陆Y(jié)果的不確定性。

1. lock() 與 unlock()

std::mutex是 C++11 中最基本的互斥量,一個(gè)線程將mutex鎖住時(shí),其它的線程就不能操作mutex,直到這個(gè)線程將mutex解鎖。

方法 說(shuō)明
1 lock() 將mutex上鎖。如果mutex已經(jīng)被其它線程上鎖,那么會(huì)阻塞,直到解鎖;如果mutex已經(jīng)被同一個(gè)線程鎖住,那么會(huì)產(chǎn)生死鎖。
2 unlock() 將mutex解鎖,釋放其所有權(quán)。如果有線程因?yàn)檎{(diào)用lock()不能上鎖而被阻塞,則調(diào)用此函數(shù)會(huì)將mutex的主動(dòng)權(quán)隨機(jī)交給其中一個(gè)線程;如果mutex不是被此線程上鎖,那么會(huì)引發(fā)未定義的異常。
3 try_lock() 嘗試將mutex上鎖。如果mutex未被上鎖,則將其上鎖并返回true;如果mutex已被鎖則返回false

示例: 使用互斥量

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
int num = 0;

void thread_function(int &n)
{
	for (int i = 0; i < 100; ++i)
	{
		mtx.lock();
		n++;
		mtx.unlock();
	}
}

int main()
{
	std::thread myThread[500];
	for (std::thread &a : myThread)
	{
		a = std::thread(thread_function, std::ref(num));
		a.join();
	}

	std::cout << "num = " << num << std::endl;
	std::cout << "Main thread exits!" << std::endl;
	return 0;
}
//result
num = 50000
Main thread exits!

注意: 在使用互斥量時(shí),需要注意以下問(wèn)題:

  • 加鎖和解鎖的順序必須相同。
  • 不能在未獲得鎖的情況下對(duì)共享數(shù)據(jù)進(jìn)行操作。
  • 由于使用了 std::mutex 來(lái)控制對(duì)共享資源的訪問(wèn),因此可能會(huì)對(duì)程序的性能造成影響,如果需要優(yōu)化程序性能,可以考慮使用無(wú)鎖編程等技術(shù)。

2. lock_guard

std::lock_guard是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)模板類,用于實(shí)現(xiàn)資源的自動(dòng)加鎖和解鎖。它是基于RAII(資源獲取即初始化)的設(shè)計(jì)理念,能夠確保在作用域結(jié)束時(shí)自動(dòng)釋放鎖資源,避免了手動(dòng)管理鎖的復(fù)雜性和可能出現(xiàn)的錯(cuò)誤。

std::lock_guard的主要特點(diǎn)如下:

  • 自動(dòng)加鎖: 在創(chuàng)建std::lock_guard對(duì)象時(shí),會(huì)立即對(duì)指定的互斥量進(jìn)行加鎖操作。這樣可以確保在進(jìn)入作用域后,互斥量已經(jīng)被鎖定,避免了并發(fā)訪問(wèn)資源的競(jìng)爭(zhēng)條件。
  • 自動(dòng)解鎖:std::lock_guard對(duì)象在作用域結(jié)束時(shí),會(huì)自動(dòng)釋放互斥量。無(wú)論作用域是通過(guò)正常的流程結(jié)束、異常拋出還是使用return語(yǔ)句提前返回,std::lock_guard都能保證互斥量被正確解鎖,避免了資源泄漏和死鎖的風(fēng)險(xiǎn)。
  • 適用于局部鎖定: 由于std::lock_guard是通過(guò)棧上的對(duì)象實(shí)現(xiàn)的,因此適用于在局部范圍內(nèi)鎖定互斥量。當(dāng)超出std::lock_guard對(duì)象的作用域時(shí),互斥量會(huì)自動(dòng)解鎖,釋放控制權(quán)。

使用std::lock_guard的一般步驟如下:

  1. 創(chuàng)建一個(gè)std::lock_guard對(duì)象,傳入要加鎖的互斥量作為參數(shù)。
  2. 執(zhí)行需要加鎖保護(hù)的代碼塊。
  3. std::lock_guard對(duì)象的作用域結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)解鎖互斥量。

示例:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // 互斥量

void thread_function()
{
    std::lock_guard<std::mutex> lock(mtx);  // 加鎖互斥量
    std::cout << "Thread running" << std::endl;
    // 執(zhí)行需要加鎖保護(hù)的代碼
}  // lock_guard對(duì)象的析構(gòu)函數(shù)自動(dòng)解鎖互斥量

int main()
{
    std::thread t1(thread_function);
    t1.join();
    std::cout << "Main thread exits!" << std::endl;
    return 0;
}

在上述示例中,std::lock_guard對(duì)象lock會(huì)在thread_function中加鎖互斥量,保護(hù)了輸出語(yǔ)句的執(zhí)行。當(dāng)thread_function結(jié)束時(shí),lock_guard對(duì)象的析構(gòu)函數(shù)會(huì)自動(dòng)解鎖互斥量。這樣可以確?;コ饬吭诤线m的時(shí)候被鎖定和解鎖,避免了多線程間的競(jìng)爭(zhēng)問(wèn)題。

總而言之,std::lock_guard提供了一種簡(jiǎn)單而安全的方式來(lái)管理互斥量的鎖定和解鎖,使多線程編程更加方便和可靠。


3. unique_lock

std::unique_lock是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)模板類,用于實(shí)現(xiàn)更加靈活的互斥量的加鎖和解鎖操作。它提供了比std::lock_guard更多的功能和靈活性。

std::unique_lock的主要特點(diǎn)如下:

  • 自動(dòng)加鎖和解鎖:std::lock_guard類似,std::unique_lock在創(chuàng)建對(duì)象時(shí)立即對(duì)指定的互斥量進(jìn)行加鎖操作,確保互斥量被鎖定。在對(duì)象的生命周期結(jié)束時(shí),會(huì)自動(dòng)解鎖互斥量。這種自動(dòng)加鎖和解鎖的機(jī)制避免了手動(dòng)管理鎖的復(fù)雜性和可能出現(xiàn)的錯(cuò)誤。

  • 支持靈活的加鎖和解鎖: 相對(duì)于std::lock_guard的自動(dòng)加鎖和解鎖,std::unique_lock提供了更靈活的方式。它可以在需要的時(shí)候手動(dòng)加鎖和解鎖互斥量,允許在不同的代碼塊中對(duì)互斥量進(jìn)行多次加鎖和解鎖操作。

  • 支持延遲加鎖和條件變量:std::unique_lock還支持延遲加鎖的功能,可以在不立即加鎖的情況下創(chuàng)建對(duì)象,稍后根據(jù)需要進(jìn)行加鎖操作。此外,它還可以與條件變量(std::condition_variable)一起使用,實(shí)現(xiàn)更復(fù)雜的線程同步和等待機(jī)制。

使用std::unique_lock的一般步驟如下:

  1. 創(chuàng)建一個(gè)std::unique_lock對(duì)象,傳入要加鎖的互斥量作為參數(shù)。
  2. 執(zhí)行需要加鎖保護(hù)的代碼塊。
  3. 可選地手動(dòng)調(diào)用lock函數(shù)對(duì)互斥量進(jìn)行加鎖,或者在需要時(shí)調(diào)用unlock函數(shù)手動(dòng)解鎖互斥量。

示例:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // 互斥量

void thread_function()
{
    std::unique_lock<std::mutex> lock(mtx);  // 加鎖互斥量
    std::cout << "Thread running" << std::endl;
    // 執(zhí)行需要加鎖保護(hù)的代碼
    lock.unlock();  // 手動(dòng)解鎖互斥量
    // 執(zhí)行不需要加鎖保護(hù)的代碼
    lock.lock();  // 再次加鎖互斥量
    // 執(zhí)行需要加鎖保護(hù)的代碼
}  
// unique_lock對(duì)象的析構(gòu)函數(shù)自動(dòng)解鎖互斥量

int main()
{
    std::thread t1(thread_function);
    t1.join();
    std::cout << "Main thread exits!" << std::endl;
    return 0;
}

在上述示例中,std::unique_lock對(duì)象lock會(huì)在創(chuàng)建時(shí)自動(dòng)加鎖互斥量,析構(gòu)時(shí)自動(dòng)解鎖互斥量。我們可以通過(guò)調(diào)用lockunlock函數(shù)手動(dòng)控制加鎖和解鎖的時(shí)機(jī),以實(shí)現(xiàn)更靈活的操作。

總而言之,std::unique_lock提供了更靈活和功能豐富的互斥量的加鎖和解鎖機(jī)制,使多線程編程更加便捷和安全。它在處理復(fù)雜的同步需求、延遲加鎖以及與條件變量的結(jié)合等方面非常有用。


四、condition_variable

std::condition_variable是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)類,用于在多線程編程中實(shí)現(xiàn)線程間的條件變量和線程同步。它提供了等待通知的機(jī)制,使得線程可以等待某個(gè)條件成立時(shí)被喚醒,或者在滿足某個(gè)條件時(shí)通知其他等待的線程。其提供了以下幾個(gè)函數(shù)用于等待和通知線程:

方法 說(shuō)明
1 wait 使當(dāng)前線程進(jìn)入等待狀態(tài),直到被其他線程通過(guò)notify_one()notify_all()函數(shù)喚醒。該函數(shù)需要一個(gè)互斥鎖作為參數(shù),調(diào)用時(shí)會(huì)自動(dòng)釋放互斥鎖,并在被喚醒后重新獲取互斥鎖。
2 wait_for wait_for(): 使當(dāng)前線程進(jìn)入等待狀態(tài),最多等待一定的時(shí)間,直到被其他線程通過(guò)notify_one()notify_all()函數(shù)喚醒,或者等待超時(shí)。該函數(shù)需要一個(gè)互斥鎖和一個(gè)時(shí)間段作為參數(shù),返回時(shí)有兩種情況:等待超時(shí)返回std::cv_status::timeout,被喚醒返回std::cv_status::no_timeout。
3 wait_until wait_until(): 使當(dāng)前線程進(jìn)入等待狀態(tài),直到被其他線程通過(guò)notify_one()notify_all()函數(shù)喚醒,或者等待時(shí)間達(dá)到指定的絕對(duì)時(shí)間點(diǎn)。該函數(shù)需要一個(gè)互斥鎖和一個(gè)絕對(duì)時(shí)間點(diǎn)作為參數(shù),返回時(shí)有兩種情況:時(shí)間到達(dá)返回std::cv_status::timeout,被喚醒返回std::cv_status::no_timeout。
4 notify_one notify_one(): 喚醒一個(gè)等待中的線程,如果有多個(gè)線程在等待,則選擇其中一個(gè)線程喚醒。
5 notify_all notify_all(): 喚醒所有等待中的線程,使它們從等待狀態(tài)返回。

std::condition_variable的主要特點(diǎn)如下:

  • 等待和通知機(jī)制:std::condition_variable允許線程進(jìn)入等待狀態(tài),直到某個(gè)條件滿足時(shí)才被喚醒。線程可以調(diào)用wait函數(shù)進(jìn)入等待狀態(tài),并指定一個(gè)互斥量作為參數(shù),以確保線程在等待期間互斥量被鎖定。當(dāng)其他線程滿足條件并調(diào)用notify_onenotify_all函數(shù)時(shí),等待的線程將被喚醒并繼續(xù)執(zhí)行。

  • 與互斥量配合使用:std::condition_variable需要與互斥量(std::mutexstd::unique_lock<std::mutex>)配合使用,以確保線程之間的互斥性。在等待之前,線程必須先鎖定互斥量,以避免競(jìng)爭(zhēng)條件。當(dāng)條件滿足時(shí),通知其他等待的線程之前,必須再次鎖定互斥量。

  • 支持超時(shí)等待:std::condition_variable提供了帶有超時(shí)參數(shù)的等待函數(shù)wait_forwait_until,允許線程在等待一段時(shí)間后自動(dòng)被喚醒。這對(duì)于處理超時(shí)情況或限時(shí)等待非常有用。

使用std::condition_variable的一般步驟如下:

  1. 創(chuàng)建一個(gè)std::condition_variable對(duì)象。
  2. 創(chuàng)建一個(gè)互斥量對(duì)象(std::mutexstd::unique_lock<std::mutex>)。
  3. 在等待線程中,使用std::unique_lock鎖定互斥量,并調(diào)用wait函數(shù)進(jìn)入等待狀態(tài)。
  4. 在喚醒線程中,使用std::unique_lock鎖定互斥量,并調(diào)用notify_onenotify_all函數(shù)通知等待的線程。
  5. 等待線程被喚醒后,繼續(xù)執(zhí)行相應(yīng)的操作。

示例:

#include <iostream>
#include <thread>
#include <condition_variable>

std::mutex mtx;  // 互斥量
std::condition_variable cv;  // 條件變量
bool isReady = false;  // 條件

void thread_function()
{
    std::unique_lock<std::mutex> lock(mtx);
    while (!isReady) 
    {
        cv.wait(lock);  // 等待條件滿足
    }
    std::cout << "Thread is notified" << std::endl;
}

int main()
{
    std::thread t(thread_function);

    // 模擬一段耗時(shí)操作
    std::this_thread::sleep_for(std::chrono::seconds(2));

    {
        std::lock_guard<std::mutex> lock(mtx);
        isReady = true;  // 設(shè)置條件為true
    }
    cv.notify_one();  // 通知等待的線程

    t.join();

    return 0;
}

上述示例中,創(chuàng)建了一個(gè)線程,該線程在等待狀態(tài)下通過(guò)cv.wait(lock)等待條件滿足。主線程經(jīng)過(guò)一段時(shí)間后將條件設(shè)置為true,然后通過(guò)cv.notify_one()通知等待的線程。等待的線程被喚醒后輸出一條消息。


五、std::atomic

std::mutex可以很好地解決多線程資源爭(zhēng)搶的問(wèn)題,但它每次循環(huán)都要加鎖、解鎖,這樣固然會(huì)浪費(fèi)很多的時(shí)間。

在 C++ 中,std::atomic 是用來(lái)提供原子操作的類,atomic,本意為原子,原子操作是最小的且不可并行化的操作。這就意味著即使是多線程,也要像同步進(jìn)行一樣同步操作原子對(duì)象,從而省去了互斥量上鎖、解鎖的時(shí)間消耗。

使用 std::atomic 可以保證數(shù)據(jù)在操作期間不被其他線程修改,這樣就避免了數(shù)據(jù)競(jìng)爭(zhēng),使得程序在多線程并發(fā)訪問(wèn)時(shí)仍然能夠正確執(zhí)行。

示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>   //必須包含

std::atomic_int num = 0;

void thread_function(std::atomic_int &n)  //修改類型
{
	for (int i = 0; i < 100; ++i)
	{
		n++;
	}
}

int main()
{
	std::thread myThread[500];
	for (std::thread &a : myThread)
	{
		a = std::thread(thread_function, std::ref(num));
		a.join();
	}

	std::cout << "num = " << num << std::endl;
	std::cout << "Main thread exits!" << std::endl;
	return 0;
}
//result
num = 50000
Main thread exits!

說(shuō)明:std::atomic_intstd::atomic<int>的別名。


如果這篇文章對(duì)你有所幫助,渴望獲得你的一個(gè)點(diǎn)贊!

c++ thread,編程概念,C++,c++,開發(fā)語(yǔ)言,面試文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-625797.html

到了這里,關(guān)于【C++】多線程(thread)使用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++之C++11 thread線程示例(一百三十八)

    C++之C++11 thread線程示例(一百三十八)

    簡(jiǎn)介: CSDN博客專家,專注Android/Linux系統(tǒng),分享多mic語(yǔ)音方案、音視頻、編解碼等技術(shù),與大家一起成長(zhǎng)! 優(yōu)質(zhì)專欄: Audio工程師進(jìn)階系列 【 原創(chuàng)干貨持續(xù)更新中…… 】?? 人生格言: 人生從來(lái)沒(méi)有捷徑,只有行動(dòng)才是治療恐懼和懶惰的唯一良藥. 更多原創(chuàng),歡迎關(guān)注:An

    2023年04月15日
    瀏覽(24)
  • C++ thread編程(Linux系統(tǒng)為例)—thread成員函數(shù)

    C++ thread編程(Linux系統(tǒng)為例)—thread成員函數(shù)

    c++ 11 之后有了標(biāo)準(zhǔn)的線程庫(kù):std::thread。 參考thread庫(kù)的使用 thread的構(gòu)造函數(shù)有下面四個(gè)重載 默認(rèn)構(gòu)造函數(shù) 初始化構(gòu)造函數(shù) 該函數(shù)使用可變參數(shù)模板來(lái)構(gòu)造一個(gè)線程對(duì)象,用來(lái)代表一個(gè)新的可join的執(zhí)行線程。這個(gè)執(zhí)行線程通過(guò)可變參數(shù)傳入線程函數(shù)對(duì)象fn,以及函數(shù)的參數(shù)

    2024年02月05日
    瀏覽(20)
  • C++多線程編程(第三章 案例1,使用互斥鎖+ list模擬線程通信)

    C++多線程編程(第三章 案例1,使用互斥鎖+ list模擬線程通信)

    主線程和子線程進(jìn)行l(wèi)ist通信,要用到互斥鎖,避免同時(shí)操作 1、封裝線程基類XThread控制線程啟動(dòng)和停止; 2、模擬消息服務(wù)器線程,接收字符串消息,并模擬處理; 3、通過(guò)Unique_lock和mutex互斥方位list 消息隊(duì)列 4、主線程定時(shí)發(fā)送消息給子線程; 代碼包含了XThread類(基類)、

    2024年02月15日
    瀏覽(20)
  • C++并發(fā)線程 - 如何線程間共享數(shù)據(jù)【詳解:如何使用鎖操作】

    C++并發(fā)線程 - 如何線程間共享數(shù)據(jù)【詳解:如何使用鎖操作】

    點(diǎn)擊進(jìn)入系列文章目錄 C++技能系列 Linux通信架構(gòu)系列 C++高性能優(yōu)化編程系列 深入理解軟件架構(gòu)設(shè)計(jì)系列 高級(jí)C++并發(fā)線程編程 期待你的關(guān)注哦?。。?快樂(lè)在于態(tài)度,成功在于細(xì)節(jié),命運(yùn)在于習(xí)慣。 Happiness lies in the attitude, success lies in details, fate is a habit. 具體哪個(gè)線程按何種

    2024年02月08日
    瀏覽(27)
  • 【C++】詳解std::thread

    【C++】詳解std::thread

    2023年9月10日,周日下午開始 2023年9月10日,周日晚上23:35完成 雖然這篇博客我今天花了很多時(shí)間去寫,但是我對(duì)std::thread有了一個(gè)完整的認(rèn)識(shí) 不過(guò)有些內(nèi)容還沒(méi)完善,以后有空再更新.... 目錄 頭文件 類的成員 類型 方法 (constructor) terminate called without an active exception是什么?

    2024年02月09日
    瀏覽(49)
  • Linux系統(tǒng)編程5(線程概念詳解)

    Linux系統(tǒng)編程5(線程概念詳解)

    線程同進(jìn)程一樣都是OS中非常重要的部分,線程的應(yīng)用場(chǎng)景非常的廣泛,試想我們使用的視頻軟件,在網(wǎng)絡(luò)不是很好的情況下,通常會(huì)采取下載的方式,現(xiàn)在你很想立即觀看,又想下載,于是你點(diǎn)擊了下載并且在線觀看。學(xué)過(guò)進(jìn)程的你會(huì)不會(huì)想,視頻軟件運(yùn)行后在OS內(nèi)形成一個(gè)

    2024年02月10日
    瀏覽(20)
  • 多線程系列(二) -Thread類使用詳解

    在之前的文章中,我們簡(jiǎn)單的介紹了線程誕生的意義和基本概念,采用多線程的編程方式,能充分利用 CPU 資源,顯著的提升程序的執(zhí)行效率。 其中 java.lang.Thread 是 Java 實(shí)現(xiàn)多線程編程最核心的類,學(xué)習(xí) Thread 類中的方法,是學(xué)習(xí)多線程的第一步。 下面我們就一起來(lái)看看,創(chuàng)

    2024年02月19日
    瀏覽(21)
  • C++ 多線程編程和線程池

    c++ 多線程需要包含thread頭文件 多線程調(diào)用函數(shù)代碼如下 子線程和主線程同時(shí)執(zhí)行,當(dāng)子線程沒(méi)執(zhí)行完,主線程結(jié)束時(shí),程序就會(huì)報(bào)錯(cuò) join,主線程等待子線程執(zhí)行完成后再執(zhí)行,只能使用一次 detach,主程序結(jié)束,子線程會(huì)在后臺(tái)執(zhí)行 joinable,判斷線程是否可以調(diào)用join和de

    2024年01月20日
    瀏覽(18)
  • C++線程入門:輕松并發(fā)編程

    ????????在現(xiàn)代計(jì)算機(jī)應(yīng)用程序中,我們經(jīng)常需要處理并發(fā)任務(wù),這就需要使用多線程來(lái)實(shí)現(xiàn)。C++是一種功能強(qiáng)大的編程語(yǔ)言,提供了豐富的線程支持,使得并發(fā)編程變得相對(duì)容易。 ????????C++ 線程是一種多線程編程模型,可以在同一個(gè)程序中同時(shí)執(zhí)行多個(gè)獨(dú)立的任務(wù)

    2024年02月04日
    瀏覽(21)
  • C++ 多線程編程(三) 獲取線程的返回值——future

    C++ 多線程編程(三) 獲取線程的返回值——future

    C++11標(biāo)準(zhǔn)庫(kù)增加了獲取線程返回值的方法,頭文件為future,主要包括 future 、 promise 、 packaged_task 、 async 四個(gè)類。 那么,了解一下各個(gè)類的構(gòu)成以及功能。 future是一個(gè)模板類,它是傳輸線程返回值(也稱為 共享狀態(tài) )的媒介,也可以理解為線程返回的結(jié)果就安置在future中。

    2024年02月02日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包