C++ 동시 프로그래밍은 스레드, 뮤텍스 및 조건 변수를 생성하여 멀티 코어 CPU를 최대한 활용합니다. 스레드를 생성하면 작업을 병렬로 실행할 수 있습니다. 뮤텍스는 여러 스레드가 동시에 공유 데이터에 액세스하지 않도록 잠금 역할을 하여 데이터 손상을 방지합니다. 조건 변수는 특정 조건이 충족되었음을 스레드에 알리는 데 사용되며 조건이 충족될 때까지 스레드가 계속 실행되는 것을 방지하기 위해 뮤텍스 잠금과 함께 사용됩니다.
C++의 동시 프로그래밍: 멀티 코어 CPU 잠금 해제
머리말
최신 CPU에는 종종 다중 코어가 있으며 이러한 코어를 최대한 활용하면 작업을 병렬로 실행할 때 코드 효율성을 크게 향상시킬 수 있습니다. C++는 프로그래머가 여러 작업을 동시에 수행할 수 있는 응용 프로그램을 쉽게 만들 수 있도록 다양한 동시 프로그래밍 도구를 제공합니다.
스레드 생성
스레드 생성은 동시성을 나타내는 기본 구성 요소입니다. C++에서는 std::thread
클래스를 사용하여 새 스레드를 생성할 수 있습니다. 별도의 스레드에서 수행할 작업을 지정하는 호출 가능 객체를 인수로 받아들입니다. std::thread
类创建新线程。它接受一个可调用对象作为参数,该对象指定在单独的线程中执行的任务。
#include <iostream> #include <thread> void hello_world() { std::cout << "Hello, world!" << std::endl; } int main() { std::thread thread1(hello_world); thread1.join(); return 0; }
在上面的代码中,hello_world()
函数是一个可调用对象,它只需向控制台打印一条消息。std::thread
构造函数创建一个新线程并执行可调用对象。thread1.join()
阻塞主线程,直到新线程完成。
互斥锁
线程并发访问共享数据时,互斥锁非常重要。它们充当锁,防止多个线程同时访问关键部分,从而避免数据损坏。在 C++ 中,可以使用 std::mutex
类创建互斥锁。
#include <iostream> #include <thread> #include <mutex> std::mutex m; // 全局互斥锁 void increment(int& counter) { std::lock_guard<std::mutex> lock(m); // 获取互斥锁 ++counter; } int main() { int counter = 0; std::thread thread1(increment, std::ref(counter)); std::thread thread2(increment, std::ref(counter)); thread1.join(); thread2.join(); std::cout << "Final counter value: " << counter << std::endl; return 0; }
在这个示例中,increment()
函数对共享变量 counter
进行递增。我们使用 std::lock_guard
来获取互斥锁,确保只有一个线程可以同时执行关键部分。这种机制确保两个线程不会同时递增 counter
,从而避免数据竞争。
条件变量
条件变量用于通知线程特定条件已满足。它们与互斥锁一起使用,以确保线程在满足条件之前不会继续执行。在 C++ 中,可以使用 std::condition_variable
类创建条件变量。
#include <iostream> #include <thread> #include <condition_variable> #include <mutex> std::mutex m; // 全局互斥锁 std::condition_variable cv; // 全局条件变量 bool ready = false; // 共享布尔标志 void producer() { std::lock_guard<std::mutex> lock(m); // 获取互斥锁 ready = true; // 设置共享标志为 true cv.notify_one(); // 通知一个等待的线程 } void consumer() { std::unique_lock<std::mutex> lock(m); // 获取互斥锁(并锁定它) while (!ready) // 等待共享标志为 true cv.wait(lock); // 释放互斥锁并等待 } int main() { std::thread producer_thread(producer); std::thread consumer_thread(consumer); producer_thread.join(); consumer_thread.join(); return 0; }
在此示例中,我们使用条件变量来协调生产者和消费者线程之间的交互。producer()
函数设置共享标志 ready
为 true 并通知消费者线程。consumer()
rrreee
hello_world()
함수는 단순히 콘솔에 메시지를 인쇄하는 호출 가능한 개체입니다. std::thread
생성자는 새 스레드를 생성하고 호출 가능 개체를 실행합니다. thread1.join()
은 새 스레드가 완료될 때까지 기본 스레드를 차단합니다. 🎜🎜🎜Mutex 잠금🎜🎜🎜Mutex 잠금은 스레드가 공유 데이터에 동시에 액세스할 때 매우 중요합니다. 이는 여러 스레드가 중요한 섹션에 동시에 액세스하는 것을 방지하는 잠금 역할을 하여 데이터 손상을 방지합니다. C++에서는 std::mutex
클래스를 사용하여 뮤텍스 잠금을 만들 수 있습니다. 🎜rrreee🎜이 예에서 increment()
함수는 공유 변수 counter
를 증가시킵니다. 우리는 std::lock_guard
를 사용하여 뮤텍스 잠금을 획득하여 동시에 하나의 스레드만 임계 섹션을 실행할 수 있도록 보장합니다. 이 메커니즘은 두 스레드가 동시에 counter
를 증가시키지 않도록 하여 데이터 경합을 방지합니다. 🎜🎜🎜조건 변수🎜🎜🎜조건 변수는 특정 조건이 충족되었음을 스레드에 알리는 데 사용됩니다. 조건이 충족될 때까지 스레드가 계속 실행되지 않도록 하기 위해 뮤텍스 잠금과 함께 사용됩니다. C++에서는 std::condition_variable
클래스를 사용하여 조건 변수를 생성할 수 있습니다. 🎜rrreee🎜이 예에서는 조건 변수를 사용하여 생산자 스레드와 소비자 스레드 간의 상호 작용을 조정합니다. producer()
함수는 공유 플래그 ready
를 true로 설정하고 소비자 스레드에 알립니다. consumer()
함수는 실행을 계속하기 전에 조건 변수를 기다려 공유 플래그가 true가 될 때까지 기다립니다. 🎜위 내용은 C++ 동시 프로그래밍: 동시성을 달성하기 위해 멀티 코어 CPU를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!