programing

C/C++ 공유 메모리에서 대기 후 알림

yellowcard 2023. 9. 27. 17:42
반응형

C/C++ 공유 메모리에서 대기 후 알림

둘 이상의 스레드 사이의 공유 메모리에 대해 자바 In C/C++에서처럼 기다렸다가 통지하는 방법은?pthread 라이브러리를 사용합니다.

대기/알림에 사용할 Java 객체 대신 뮤텍스와 조건 변수라는 두 개의 객체가 필요합니다.이들은 다음과 같이 초기화됩니다.pthread_mutex_init그리고.pthread_cond_init.

자바 객체에서 동기화를 했을 경우 다음을 사용합니다.pthread_mutex_lock그리고.pthread_mutex_unlock(C에서는 직접 수동으로 쌍을 구성해야 합니다.)대기/알림이 필요 없는 경우 잠금/잠금 해제만 하면 조건 변수는 필요 없고 뮤텍스만 필요합니다.음소거가 반드시 "재귀적"일 필요는 없다는 것을 명심하십시오. 이는 잠금을 이미 잡고 있는 경우, 해당 동작을 원한다는 init 플래그를 설정하지 않으면 다시 잠금을 취할 수 없다는 것을 의미합니다.

당신이 전화했을 장소.java.lang.Object.wait,불러pthread_cond_wait아니면pthread_cond_timedwait.

당신이 전화했을 장소.java.lang.Object.notify,불러pthread_cond_signal.

당신이 전화했을 장소.java.lang.Object.notifyAll,불러pthread_cond_broadcast.

자바와 같이 wait 기능에서 가짜 wake up이 가능하기 때문에 통화 전에 설정하고 통화 후에 확인하여 wait하는 조건이 필요하며 통화를 해야 합니다.pthread_cond_wait고리 모양으로Java에서와 마찬가지로 대기 중에는 뮤텍스가 해제됩니다.

전화를 할 수 없는 자바와 달리notify당신이 모니터를 잡지 않는 한, 당신은 실제로 전화할 수 있습니다.pthread_cond_signal무턱대고 말입니다하지만 보통은 아무 것도 얻을 수 없고, 종종 정말 나쁜 생각입니다(보통 잠금 - 설정 조건 - 신호 - 잠금 해제를 원하기 때문입니다).그래서 그냥 무시하고 자바처럼 취급하는 것이 최선입니다.

그 이상의 것은 없습니다. 기본적인 패턴은 자바와 같고 우연이 아닙니다.그러나 알고 싶은 다양한 플래그와 재미있는 행동이 있으므로 모든 기능에 대한 설명서를 읽으십시오.

C++에서는 단순히 pthreads API를 사용하는 것보다 조금 더 잘 할 수 있습니다.당신은 적어도 RAII를 뮤텍스 잠금/잠금 해제에 적용해야 하지만, 당신이 사용할 수 있는 C++ 라이브러리에 따라서 pthread 기능에 대해 C++-ish 래퍼를 사용하는 것이 더 나을 수 있습니다.

당신의 제목에서, 당신은 C와 C++를 아주 아무렇지 않게 "C/C++"로 섞습니다.저는 당신이 그 둘을 혼합한 프로그램을 쓰는 것입니다.

C++11을 사용하는 경우 휴대용 대체 pthread를 찾을 수 있습니다(POSIX 시스템에서는 일반적으로 후드 아래에 pthread를 사용함).

합니다.std::condition_variable+std::mutex기다림/notify을 위해이 예에서는 다음과 같은 방법을 보여 줍니다.

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
bool mainReady = false;
bool workerReader = false;
 
void worker_thread()
{
    // Wait until main() sends data
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return mainReady;});
    }
 
    std::cout << "Worker thread is processing data: " << data << std::endl;
    data += " after processing";
 
    // Send data back to main()
    {
        std::lock_guard<std::mutex> lk(m);
        workerReady = true;
        std::cout << "Worker thread signals data processing completed\n";
    }
    cv.notify_one();
}
 
int main()
{
    std::thread worker(worker_thread);
 
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        mainReady = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
 
    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return workerReady;});
    }
    std::cout << "Back in main(), data = " << data << '\n';
 

    // wait until worker dies finishes execution
    worker.join();
}

pthread_cond_wait 및 pthread_cond_signal를 사용하여 조건에 따라 동기화할 수 있습니다.

조건 변수를 사용하는 것도 한 가지 방법입니다. 이 변수는 사용할 때 사용할 수 있습니다.pthreadLinux 아래의 라이브러리(링크 참조).

조건 변수는 pthread_cond_t 유형의 변수로 대기 및 추후 공정 진행에 적합한 함수와 함께 사용됩니다.

휴대성에 신경 쓰지 않는다면 리눅스는 원하는 것을 정확하게 제공하는 eventfd를 제공합니다.각 eventfd는 내부 카운터를 유지합니다.기본 모드에서 카운터가 0이면 eventfd에서 판독하면 즉시 반환됩니다.여기에 쓰면 내부 카운터가 추가됩니다.

대기 일 입니다.uint64_t buf_a; read(event_fd, &buf_a, sizeof(buf_a)); buff 는 8 를 서합니다.합니다를 해야 합니다.uint64_t buf_b = 1; write(event_fd, &buf_b, sizeof(buf_b));.

사용 가능한 경우 POSIX 세마포어를 사용할 수 있습니다.pthread 라이브러리에는 음소거가 있으므로 사용자에게도 적합할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2085511/wait-and-notify-in-c-c-shared-memory

반응형