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
행운을 빕니다.
위해서WaitForMultipleObjects
WaitAll
시도해 보십시오.
#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
'source' 카테고리의 다른 글
팬더 데이터 프레임의 첫 몇 줄을 읽는 방법 (0) | 2023.10.04 |
---|---|
'void*'를 해제해도 괜찮습니까? (0) | 2023.10.04 |
Office 365용 VSTO 추가 기능 (0) | 2023.10.04 |
Angularjs - 본문 요소 내부 지시어 가져오기 (0) | 2023.10.04 |
라라벨:User::의 ID를 가져옵니다. 이 ID를 사용하여 새 행을 만들고 삽입합니다. (0) | 2023.10.04 |