멀티쓰레드에서 작업을 강제종료시킬때의 질문입니다.
글쓴이: cococo / 작성시간: 목, 2008/09/18 - 7:50오전
안녕하신지요.
전에 질문 올린 것과 별개의 이야기가 될 것 같아 새로 질문 올려 봅니다.
예를 들어, 복수의 쓰레드를 만들어서 쓰레드A는 Blocking상태로 작업을 기다리고, 쓰레드 B는 프로그램 전체의 종료를 검사한다고 하죠.
그럼, A가 Blocking 상태 - 예를 들어 getc() 로 대기중이라거나.. - 임에도 불구하고 쓰레드 B가 현재 실행중인 프로그램을 종료해야 한다고 판단하면, 쓰레드 A의 작업을 인터럽트 해서 A쓰레드를 종료시켜야 하잖아요?
이럴때 어떻게 하나요?
저는 signal로 하는 거라고 생각했습니다만... 시그널은 멀티쓰레드나 멜티프로세스에서는 잘 안 쓴다고 하네요?
Select()로 해도 안될테고, 그렇다고 커널에 인터럽트 루틴을 추가하는 건 빈대 잡자고 집 태우는 짓(사실 할 줄도 모릅니다만 -_-;) 같구요.
고견 부탁드립니다. 좋은 하루 되시기 바랍니다.
Forums:


pthread 라면 여기저기
pthread 라면 여기저기 널린 문서를 읽어보세요.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> static void *infinite_loop(void *arg) { char b[128]; do { printf("wait for scanf()\n"); scanf("%s", &b[0]); printf("done\n"); } while (1); return (void*)(NULL); } static void control_cleanup(void *arg) { pthread_t *tids = arg; printf("try to kill thread #0\n"); pthread_cancel(tids[0]); } static void *control(void *arg) { pthread_cleanup_push(control_cleanup, arg) do { pthread_testcancel(); } while (1); pthread_cleanup_pop(1); return (void*)(NULL); } int main(int argc, char **argv) { pthread_t tids[2]; int ret; ret = pthread_create(&tids[0], NULL, infinite_loop, &tids[0]); if (ret) { perror("pthread_create()"); return EXIT_FAILURE; } ret = pthread_create(&tids[1], NULL, control, &tids[0]); if (ret) { perror("pthread_create()"); return EXIT_FAILURE; } sleep(5); printf("try to kill thread #1\n"); pthread_cancel(tids[1]); pthread_join(tids[0], (void**)NULL); pthread_join(tids[1], (void**)NULL); return EXIT_SUCCESS; }OTL
답변 감사드립니다.
큰 도움이 되었습니다.
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
댓글 달기