>백엔드 개발 >C++ >C++의 멀티스레드 프로그래밍 기술

C++의 멀티스레드 프로그래밍 기술

王林
王林원래의
2023-08-21 21:00:44962검색

컴퓨터 하드웨어가 지속적으로 개선됨에 따라 점점 더 많은 소프트웨어가 멀티스레딩 기술을 사용하여 프로그램 성능과 응답 속도를 향상시키기 시작했습니다. C++ 언어는 다중 스레드 프로그래밍을 지원하는 언어입니다. 이 기사에서는 C++의 몇 가지 다중 스레드 프로그래밍 기술을 소개합니다.

  1. 멀티스레딩의 개념을 이해하세요

멀티스레딩 프로그래밍을 하기 전에 스레드가 무엇인지 이해해야 합니다. 스레드는 프로그램 실행의 가장 작은 단위입니다. 자체 프로그램 카운터, 레지스터 세트 및 스택을 가지며 프로세스의 코드 세그먼트, 데이터 세그먼트 및 리소스를 공유합니다. 다중 스레드 프로그래밍을 사용하면 여러 스레드를 동시에 실행할 수 있으며 이러한 스레드는 동시에 실행될 수 있습니다.

  1. 뮤텍스 잠금을 사용하여 공유 리소스 보호

멀티 스레드 프로그래밍에서는 여러 스레드가 동시에 동일한 공유 리소스에 액세스할 수 있습니다. 이로 인해 데이터 불일치가 발생할 수 있으므로 공유 리소스를 보호하기 위해 뮤텍스를 사용해야 합니다. 뮤텍스는 여러 스레드가 동일한 리소스를 공유할 수 있지만 하나의 스레드만 리소스에 액세스할 수 있도록 하는 동기화 기본 요소입니다. C++ 표준 라이브러리는 뮤텍스 잠금 메커니즘을 지원하기 위해 std::mutex 클래스를 제공합니다.

예를 들어 다음 코드 조각을 사용하여 변수의 읽기 및 쓰기 작업을 보호할 수 있습니다.

#include <mutex>
#include <iostream>

std::mutex mtx; // 申明一个互斥锁

int main()
{
    int count = 0;
    std::thread t1([&count]() {
        for (int i = 0; i < 1000000; i++) {
            mtx.lock(); // 加锁
            count++;
            mtx.unlock(); // 解锁
        }
    });

    std::thread t2([&count]() {
        for (int i = 0; i < 1000000; i++) {
            mtx.lock(); // 加锁
            count++;
            mtx.unlock(); // 解锁
        }
    });

    t1.join();
    t2.join();

    std::cout << "count: " << count << std::endl;
    return 0;
}

위 코드에서는 std::mutex 개체를 생성하여 count 변수의 읽기 및 쓰기 작업을 보호합니다. mtx. mtx.lock() 함수를 사용하여 mtx 객체를 잠그고 다른 스레드가 count 변수에 액세스하는 것을 금지합니다. mtx.unlock() 함수를 사용하면 mtx 객체의 잠금을 해제하고 다른 스레드가 count 변수에 액세스할 수 있습니다.

  1. 조건 변수를 사용하여 스레드 대기 및 알림

멀티 스레드 프로그래밍에서는 실행을 계속하기 전에 특정 조건이 충족될 때까지 기다려야 하는 경우가 있습니다. 이 경우 조건 변수를 사용하여 다른 스레드를 기다리고 알릴 수 있습니다.

조건 변수는 스레드가 바쁘게 기다리는 대신 특정 이벤트를 기다릴 수 있도록 하는 동기화 메커니즘입니다. 스레드가 조건 변수를 기다리면 다른 스레드가 조건 변수를 통해 이를 알릴 때까지 절전 모드로 전환됩니다. C++ 표준 라이브러리는 조건 변수 메커니즘을 지원하기 위해 std::condition_variable 클래스를 제공합니다.

예를 들어 다음 코드 조각을 사용하여 스레드를 기다리고 알릴 수 있습니다.

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

std::mutex mtx;
std::condition_variable cv;
bool is_ready = false;

void work()
{
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return is_ready; }); // 等待条件变量满足
    std::cout << "Work started!" << std::endl;
}

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

    std::this_thread::sleep_for(std::chrono::seconds(2));

    {
        std::lock_guard<std::mutex> lock(mtx);
        is_ready = true;
    }

    cv.notify_one(); // 通知工作线程条件变量
    t.join();
    return 0;
}

위 코드에서는 작업자 스레드 t를 생성하고 std::unique_locke72b3c73eefdfe1ad5a5ce11c373391e를 사용하여 뮤텍스 잠금 보호를 수행합니다. 스레드 t는 실행을 계속하기 전에 조건 변수가 충족될 때까지 기다립니다. 메인 스레드에서는 std::lock_guard<:mutex>를 사용하여 뮤텍스를 잠그고 is_ready 변수의 값을 변경한 다음 cv.notify_one()을 통해 t 조건 변수가 충족되었음을 스레드에 알립니다.

  1. 원자적 연산을 보장하려면 std::atomic을 사용하세요.

멀티 스레드 프로그래밍에서는 일반적으로 여러 스레드가 동일한 변수를 동시에 수정합니다. 이 경우 변수에 대한 작업이 원자성인지 확인해야 합니다. C++ 표준 라이브러리는 원자성 작업을 지원하기 위해 std::atomic 유형을 제공합니다.

std::atomic 유형은 작업이 원자적임을 보장합니다. 즉, 어떤 상황에서도 일련의 작업이 다른 스레드에 의해 중단되지 않도록 보장합니다. 경쟁 조건 및 기타 멀티스레딩 관련 문제를 방지하려면 std::atomic 클래스를 사용하십시오.

예를 들어 다음 코드 조각을 사용하여 std::atomic의 사용을 시연할 수 있습니다.

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> counter(0); // 申明一个原子性变量

void func()
{
    for (int i = 0; i < 1000000; ++i) {
        counter++; // 自增操作
    }
}

int main()
{
    std::thread t1(func);
    std::thread t2(func);

    t1.join();
    t2.join();

    std::cout << "counter: " << counter << std::endl;
    return 0;
}

위 코드에서는 두 개의 스레드 t1과 t2를 만들고 std::atomic

요약

이 문서에서는 C++의 몇 가지 다중 스레드 프로그래밍 기술을 소개합니다. 뮤텍스 잠금 및 조건 변수를 사용하면 공유 리소스를 보호하고 스레드 통신을 구현할 수 있으며 std::atomic을 사용하면 원자성 작업을 보장하고 멀티스레딩 관련 문제를 피할 수 있습니다. 멀티스레드 프로그래밍을 사용할 때는 스레드 안전성과 정확성에 주의하고 공유 리소스에 대한 작업이 원자성인지 확인하세요.

위 내용은 C++의 멀티스레드 프로그래밍 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.