source

Linux에서 WaitForSingleObject 및 WaitForMultipleObjects equivalent?

lovecheck 2023. 10. 4. 22:01
반응형

Linux에서 WaitForSingleObject 및 WaitForMultipleObjects equivalent?

윈도우에서 리눅스로 애플리케이션을 마이그레이션하고 있습니다.저는 에 대한 문제에 직면해 있습니다.WaitForSingleObject그리고.WaitForMultipleObjects인터페이스들

애플리케이션에서 나는 모든 스레드가 상위 프로세스의 이벤트를 기다리거나 t초마다 주기적으로 실행되는 여러 스레드를 생성합니다.

확인했습니다pthread_cond_timedwait, 절대적인 시간을 정해야 합니다

유닉스에서 이를 구현하려면 어떻게 해야 합니까?

고수하기pthread_cond_timedwait사용.clock_gettime. 예를 들어,

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);

원하시면 기능으로 포장해주세요.


업데이트: 의견을 바탕으로 답변을 보완합니다.

POSIX에는 Windows처럼 "모든 유형"의 이벤트/오브젝트를 대기할 수 있는 API가 하나도 없습니다.각각의 기능이 있습니다.종료를 위해 스레드에 알리는 가장 간단한 방법은 원자 변수/연산을 사용하는 것입니다.예를 들어,

주 스레드:

// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);

// "Signal" termination by changing the initial value
atomic_inc(&must_terminate); 

보조 스레드:

// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
    // Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status

다른 대안은 다음을 사용하여 취소 요청을 보내는 것입니다.pthread_cancel. 취소 중인 스레드가 호출되었을 것입니다.pthread_cleanup_push필요한 모든 정리 처리기를 등록합니다.이러한 핸들러는 등록된 순서와 반대로 호출됩니다.전화 안하기pthread_exit정의되지 않은 행동이기 때문에 청소 처리자로부터 받은 것입니다.취소된 스레드의 종료 상태:PTHREAD_CANCELED. 이 대안을 선택한다면 주로 취소점과 종류를 읽어보는 것을 추천합니다.

그리고 마지막으로 전화하는 것도 중요합니다.pthread_join인수를 통해 전달된 스레드가 종료될 때까지 현재 스레드를 차단합니다.보너스로 스레드의 종료 상태를 확인할 수 있습니다.

NAT(NeoSmart Technologies)은 최근 POSIX에서 WIN32 수동자동 재설정 이벤트를 구현하고 WaitForSingleObject와 WaitForMultipleObjects 클론을 모두 포함하는 오픈 소스(MIT 라이선스) 라이브러리를 출시했습니다.

개인적으로 POSIX 기계에서 코딩을 할 때는 POSIX 멀티스레딩 및 시그널링 패러다임을 사용하는 것을 권장하지만, 이벤트는 필요한 경우 다른 선택 사항을 제공합니다.

이것이 이제는 오래된 질문이라는 것을 깨달았지만, 이 소스는 pthread_join()이 WaitForSingleObject()와 효과적으로 동일한 작업을 수행한다고 제안합니다.

http://www.ibm.com/developerworks/linux/library/l-ipc2lin1/index.html

행운을 빕니다.

위해서WaitForMultipleObjectsWaitAll시도해 보십시오.

#include <unistd.h>
#include <pthread.h>
#include <stdio.h>

using namespace std;

pthread_cond_t condition;
pthread_mutex_t signalMutex;
pthread_mutex_t eventMutex;
int finishedTask = -1;

void* task(void *data)
{
    int num = *(int*)data;
    // Do some
    sleep(9-num);
    // Task finished
    pthread_mutex_lock(&eventMutex); // lock until the event will be processed by main thread
    pthread_mutex_lock(&signalMutex); // lock condition mutex
    finishedTask = num; // memorize task number
    pthread_cond_signal(&condition);
    pthread_mutex_unlock(&signalMutex); // unlock condtion mutex
}

int main(int argc, char *argv[])
{
    pthread_t thread[10];

    pthread_cond_init(&condition, NULL);
    pthread_mutex_init(&signalMutex, NULL); // First mutex locks signal
    pthread_mutex_init(&eventMutex, NULL); // Second mutex locks event processing

    int numbers[10];

    for (int i = 0; i < 10; i++) {
        numbers[i] = i;
        printf("created %d\n", i); // Creating 10 asynchronous tasks
        pthread_create(&thread[i], NULL, task, &numbers[i]);
    }

    for (int i = 0; i < 10;)
    {
        if (finishedTask >= 0) {
            printf("Task %d finished\n", finishedTask); // handle event
            finishedTask = -1; // reset event variable
            i++;
            pthread_mutex_unlock(&eventMutex); // unlock event mutex after handling
        } else {
            pthread_cond_wait(&condition, &signalMutex); // waiting for event
        }
    }

    return 0;
}

언급URL : https://stackoverflow.com/questions/2719580/waitforsingleobject-and-waitformultipleobjects-equivalent-in-linux

반응형