문제

프로세스 간 통신 모듈(프로세스 A 및 프로세스 B)을 프로그래밍하고 있습니다.

프로세스 A가 특정 작업을 마치자마자 B의 통신 스레드가 실행(잠금 해제)될 수 있는 방법이 있습니까? 즉, B가 폴링을 수행하지 않고 A가 작업을 마친 후 B가 너무 오래 기다리지 않는다는 뜻입니까?

이러한 문제를 다루는 개념/모델/디자인 패턴은 무엇입니까?(프로세스 간 동기화보다 더 정확한 것)어떤 라이브러리/방법을 추천하시나요?

감사해요.

편집하다:세 가지 주요 OS 각각에 적합한 방법을 찾고 있습니다.MS 윈도우, 애플 맥 OS X, GNU/리눅스.

도움이 되었습니까?

해결책

이것은 꽤 어려운 일입니다.

UNIX OS의 경우 사용할 수 있습니다.

  • setpshared 인수가있는 pthread 조건 및 뮤텍스.

    참고 : Solaris의 Linux 2.6에 따라 잘 지원되지만 FreeBSD 및 Cygwin을 지원하지 않습니다 (Mac OS X에 대해 모릅니다).

  • Unixes의 경우 이름이 지명 된 세마포어를 사용할 수도 있지만 지원 수준을 모르겠습니다.

  • 창문에는 몇 가지 이벤트가 있습니다 ...

이것은 특히 IPC에게 어려운 일입니다 ...

따라서 휴대용 무언가를 원한다면 조건과 뮤트가있는 Boost.interprocess를 살펴 보는 것이 좋습니다.

그러나 지원하려는 모든 OS에서 지원되는 모든 기능이 있는지 확인하십시오.

boost.interprocess에 대해 주목해야 할 사항

boost.interprosess는 항상 지원되지 않는 pthread_* 함수를 사용하고 에뮬레이션에 다시 실패합니다. 그러한 에뮬레이션의 품질을 확인하십시오.

또한 Win32 API에는 "공유 메모리"뮤트가 없다는 것을 알고있는 한이 물건이 창에서 어떻게 작동하는지 확인하십시오. 일반적으로 이름이 지정된 객체를 사용해야하므로 지원되는 내용과 방법을 확인하십시오.

다른 팁

편집하다: IPC를 위해 수정 된 Inter Thread Synchronizing이 필요하다고 잘못 생각했습니다.

기다릴 수있는 이벤트와 같은 것이 필요하다고 생각합니다.

창에서 사용할 수 있습니다 CreateEvent(), Auto-Reset 이벤트를 작성 (또는 기존)로 만들기 위해.

처리가 완료되면 처리를 호출해야합니다 SetEvent(), 프로세스 B는 호출해야합니다 WaitForSingleObject() 완료 될 때까지 잠을 자십시오 (또는 타임 아웃).

또는 생성 된 세마포어를 사용할 수 있습니다 CreateSemaphore(), 0으로 초기화 ReleaseSemaphore(), 프로세스 B가 다시 사용하는 동안 WaitForSingleObject() 완료를 기다리려면.

Linux 및 OS X에서는 세마포어를 사용하여 유사한 효과를 얻을 수 있습니다. 사용 sem_open() 초기 값으로 0을 가진 세마포어를 생성합니다.

처리가 완료되면 호출해야합니다 sem_post() 세마포어를 증가 시키려면 프로세스 B가 호출해야합니다. sem_wait() 완성 될 때까지 잠을 자십시오.

노트: 세마포어 방법은 여러 완료를 신호로 표시 할 수 있습니다. Windows에서 최대 수를 설정하거나 현재 SEM 값을 확인하여이를 처리해야합니다. sem_getvalue()


조건 변수가 당신이하려는 일에 적합하다고 생각합니다. 여기 Linux 및 OSX에서 작동하는 샘플이 있습니다.

#include <pthread.h>
/* no error checking, quick and dirty sample */
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int a_done = 0;

void init(void)
{
    pthread_mutex_init(&g_mutex, NULL);
    pthread_cond_init(&g_cond, NULL);
}

void thread_a(void *arg)
{
    /* do something here... */
    pthread_mutex_lock(&g_mutex);
    a_done = 1;
    pthread_cond_signal(&g_cond);
    pthread_mutex_unlock(&g_mutex);
}

void thread_b(void *arg)
{
    /* wait for a to complete */
    pthread_mutex_lock(&g_mutex);
    while (!a_done)
        pthread_cond_wait(&g_cond, &g_mutex);
    a_done = 0;
    pthread_mutex_unlock(&g_mutex);
}

창문 아래에서 사용할 수 있습니다 PTHREADS-WIN32, Vista의 기본 조건 변수는 MSDN 조건 변수 자세한 내용은 페이지입니다.

참조 :

OS가 신호를 지원하는 경우 신호 핸들러에서 뮤텍스를 잠금 해제하고 작업을 완료하자마자 프로세스 A에서 신호를 보낼 수 있습니다.

프로세스 B는 MUTEX 또는 기타 동기화 도구를 기다리고 있으며 A는 무엇이든 작업 할 것입니다. 그러면 마감이 신호를 보내면 USR1을 보내고 프로세스 B의 USR1 핸들러는 해당 동기화 도구를 잠금 해제합니다.

가장 일반적인 것은 select ()/poll ()을 사용하는 것입니다. 모두 입력을 사용할 수있는 경우 여러 파일 설명자를 확인할 수 있습니다. 둘 다 타임 아웃 매개 변수를 수신합니다. 이는 바쁜 대기를 방지하여 100% CPU를 소비 할 수 있습니다. 이것은 중소/중간 애플리케이션에 매우 적합한 솔루션입니다.

또 다른 접근법은 별도의 스레드에서 폴링하는 것입니다.

큰 응용 프로그램을 개발하려면 바라 볼 가치가 있습니다. 에이스 프레임 워크 또는후원. 이 프레임 워크는 크로스 플랫폼 솔루션으로 잘 설계되고 잘 테스트되었습니다.

글쎄, 내 생각과 경험에 따르면 이식 가능하고 간단한 방법으로 이를 수행하는 가장 좋은 방법은 소켓을 사용하는 것입니다.또한 (필요한 경우) 서로 다른 시스템에 두 프로세스를 둘 수도 있습니다.또한 동기화 이상의 기능을 처리하도록 통신을 확장할 수 있습니다.

폴링을 원하지 않으면 소켓에서 동기화 메시지를 기다리는 스레드를 사용하십시오.차단 방식으로 소켓을 읽습니다.메시지를 받으면 표준 다중 스레드 동기화를 사용하여 동기화를 처리합니다.귀하의 경우 B는 A가 끝날 때까지 기다려야 하므로 프로세스에서 차단 방식으로 읽어야 합니다.

이식 가능하려면 다음과 같은 이식 가능한 소켓 라이브러리를 사용하십시오. 후원 또는 ptype 또는 무엇이든.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top