멀티쓰레드에서 작업을 강제종료시킬때의 질문입니다.

cococo의 이미지

안녕하신지요.
전에 질문 올린 것과 별개의 이야기가 될 것 같아 새로 질문 올려 봅니다.

예를 들어, 복수의 쓰레드를 만들어서 쓰레드A는 Blocking상태로 작업을 기다리고, 쓰레드 B는 프로그램 전체의 종료를 검사한다고 하죠.
그럼, A가 Blocking 상태 - 예를 들어 getc() 로 대기중이라거나.. - 임에도 불구하고 쓰레드 B가 현재 실행중인 프로그램을 종료해야 한다고 판단하면, 쓰레드 A의 작업을 인터럽트 해서 A쓰레드를 종료시켜야 하잖아요?
이럴때 어떻게 하나요?
저는 signal로 하는 거라고 생각했습니다만... 시그널은 멀티쓰레드나 멜티프로세스에서는 잘 안 쓴다고 하네요?
Select()로 해도 안될테고, 그렇다고 커널에 인터럽트 루틴을 추가하는 건 빈대 잡자고 집 태우는 짓(사실 할 줄도 모릅니다만 -_-;) 같구요.

고견 부탁드립니다. 좋은 하루 되시기 바랍니다.

bushi의 이미지

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

cococo의 이미지

큰 도움이 되었습니다.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.