pthread_cancel(3) - wariua/manpages-ko GitHub Wiki

NAME

pthread_cancel - μŠ€λ ˆλ“œμ—κ²Œ μ·¨μ†Œ μš”μ²­ 보내기

SYNOPSIS

#include <pthread.h>

int pthread_cancel(pthread_t thread);

-pthread둜 링크.

DESCRIPTION

pthread_cancel() ν•¨μˆ˜λŠ” μŠ€λ ˆλ“œ threadμ—κ²Œ μ·¨μ†Œ μš”μ²­μ„ 보낸닀. λŒ€μƒ μŠ€λ ˆλ“œκ°€ μ·¨μ†Œ μš”μ²­μ— λ°˜μ‘ν• μ§€, κ·Έλ ‡λ‹€λ©΄ μ–Έμ œμΌμ§€λŠ” κ·Έ μŠ€λ ˆλ“œμ˜ ν†΅μ œ ν•˜μ— μžˆλŠ” 두 κ°€μ§€ 속성, 즉 μ·¨μ†Œ κ°€λŠ₯μ„± μƒνƒœμ™€ μœ ν˜•μ— 달렀 μžˆλ‹€.

μŠ€λ ˆλ“œμ˜ μ·¨μ†Œ κ°€λŠ₯μ„± μƒνƒœλŠ” pthread_setcancelstate(3)둜 κ²°μ •ν•˜λ©° ν™œμ„±(μƒˆ μŠ€λ ˆλ“œμ˜ κΈ°λ³Έκ°’)μ΄κ±°λ‚˜ λΉ„ν™œμ„±μΌ 수 μžˆλ‹€. μŠ€λ ˆλ“œμ—μ„œ μ·¨μ†Œλ₯Ό λΉ„ν™œμ„±ν™”ν–ˆμœΌλ©΄ λ‹€μ‹œ μ·¨μ†Œλ₯Ό ν™œμ„±ν™”ν•  λ•ŒκΉŒμ§€ μ·¨μ†Œ μš”μ²­μ΄ 큐에 남아 μžˆλŠ”λ‹€. μŠ€λ ˆλ“œμ—μ„œ μ·¨μ†Œλ₯Ό ν™œμ„±ν™”ν–ˆμœΌλ©΄ μ·¨μ†Œ κ°€λŠ₯μ„± μœ ν˜•μ΄ μ·¨μ†Œ λ°œμƒ μ‹œμ μ„ κ²°μ •ν•œλ‹€.

μŠ€λ ˆλ“œμ˜ μ·¨μ†Œ μœ ν˜•μ€ pthread_setcanceltype(3)으둜 κ²°μ •ν•˜λ©° λΉ„λ™κΈ°λ‚˜ μ—°κΈ°(μƒˆ μŠ€λ ˆλ“œμ˜ κΈ°λ³Έκ°’)일 수 μžˆλ‹€. 비동기 μ·¨μ†ŒλŠ” μŠ€λ ˆλ“œκ°€ μ–Έμ œλ“  (일반적으둜 μ¦‰μ‹œμ΄μ§€λ§Œ μ‹œμŠ€ν…œμ—μ„œ 보μž₯ν•˜μ§€ μ•ŠμŒ) μ·¨μ†Œλ  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€. μ—°κΈ° μ·¨μ†ŒλŠ” μŠ€λ ˆλ“œμ—μ„œ μ·¨μ†Œμ μΈ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒκΉŒμ§€ μ·¨μ†Œκ°€ μ—°κΈ°λœλ‹€λŠ” λœ»μ΄λ‹€. μ·¨μ†Œμ μ΄κ±°λ‚˜ μ·¨μ†Œμ μΌ μˆ˜λ„ μžˆλŠ” ν•¨μˆ˜λ“€μ˜ λͺ©λ‘μ΄ pthreads(7)에 μžˆλ‹€.

μ·¨μ†Œ μš”μ²­μ— λ°˜μ‘ν•  λ•Œ threadμ—μ„œλŠ” λ‹€μŒ 단계듀이 (μ°¨λ‘€λ‘œ) 이뀄진닀.

  1. μ·¨μ†Œ 정리 ν•Έλ“€λŸ¬λ₯Ό (집어넣은 μˆœμ„œ λ°˜λŒ€λ‘œ) κΊΌλ‚΄μ„œ ν˜ΈμΆœν•œλ‹€. (pthread_cleanup_push(3)) μ°Έκ³ .)

  2. μŠ€λ ˆλ“œλ³„ 데이터 μ†Œλ©Έμžλ“€μ΄ λͺ…μ„Έ μ•ˆ 된 μˆœμ„œλ‘œ ν˜ΈμΆœλœλ‹€. (pthread_key_create(3) μ°Έκ³ .)

  3. μŠ€λ ˆλ“œκ°€ μ’…λ£Œλœλ‹€. (pthread_exit(3) μ°Έκ³ .)

μœ„ 단계듀은 pthread_cancel() 호좜과 λΉ„λ™κΈ°μ μœΌλ‘œ 이뀄진닀. pthread_cancel()의 λ°˜ν™˜ μƒνƒœλŠ” μ·¨μ†Œ μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ 큐에 λ“€μ–΄κ°”λŠ”μ§€λ₯Ό ν˜ΈμΆœμžμ—κ²Œ μ•Œλ € 쀄 뿐이닀.

μ·¨μ†Œλœ μŠ€λ ˆλ“œκ°€ μ’…λ£Œν•œ 후에 pthread_join(3)으둜 κ·Έ μŠ€λ ˆλ“œμ™€ ν•©λ₯˜ν•˜λ©΄ μŠ€λ ˆλ“œ μ’…λ£Œ μƒνƒœλ‘œ PTHREAD_CANCELEDλ₯Ό μ–»λŠ”λ‹€. (μŠ€λ ˆλ“œμ™€ ν•©λ₯˜ν•˜λŠ” 것은 μ·¨μ†Œκ°€ μ™„λ£ŒλλŠ”μ§€ μ•Œ 수 μžˆλŠ” μœ μΌν•œ 방법이닀.)

RETURN VALUE

성곡 μ‹œ pthread_cancel()은 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ 0 μ•„λ‹Œ 였λ₯˜ 번호λ₯Ό λ°˜ν™˜ν•œλ‹€.

ERRORS

ESRCH
IDκ°€ thread인 μŠ€λ ˆλ“œλ₯Ό 찾을 수 μ—†λ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
pthread_cancel() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

NOTES

λ¦¬λˆ…μŠ€μ—μ„œλŠ” μ‹œκ·Έλ„μ„ μ΄μš©ν•΄ μ·¨μ†Œλ₯Ό κ΅¬ν˜„ν•œλ‹€. NPTL μŠ€λ ˆλ”© κ΅¬ν˜„μ—μ„œλŠ” 첫 번째 μ‹€μ‹œκ°„ μ‹œκ·Έλ„(즉 μ‹œκ·Έλ„ 32)을 이 μš©λ„μ— μ“΄λ‹€. LinuxThreadsμ—μ„œλŠ” μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ΄ μ‚¬μš© κ°€λŠ₯ν•˜λ©΄ 두 번째 μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ„ μ“°κ³  μ•„λ‹ˆλ©΄ SIGUSR2λ₯Ό μ“΄λ‹€.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν–ˆλ‹€κ°€ μ·¨μ†Œν•œλ‹€. 메인 μŠ€λ ˆλ“œκ°€ μ·¨μ†Œλœ μŠ€λ ˆλ“œμ™€ ν•©λ₯˜ν•΄μ„œ μ’…λ£Œ μƒνƒœκ°€ PTHREAD_CANCELED인지 ν™•μΈν•œλ‹€. λ‹€μŒ μ…Έ μ„Έμ…˜μ€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ 보여 μ€€λ‹€.

$ ./a.out
thread_func(): started; cancellation disabled
main(): sending cancellation request
thread_func(): about to enable cancellation
main(): thread was canceled

ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€

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

#define handle_error_en(en, msg) \
        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void *
thread_func(void *ignored_argument)
{
    int s;

    /* μ·¨μ†Œλ₯Ό μž μ‹œ λΉ„ν™œμ„±ν™”ν•΄μ„œ μ·¨μ†Œ μš”μ²­μ—
       μ¦‰μ‹œ λ°˜μ‘ν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° */

    s = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_setcancelstate");

    printf("thread_func(): started; cancellation disabled\n");
    sleep(5);
    printf("thread_func(): about to enable cancellation\n");

    s = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_setcancelstate");

    /* sleep()은 μ·¨μ†Œμ μž„ */

    sleep(1000);        /* μž λ“€μ–΄ μžˆλŠ” λ™μ•ˆ μ·¨μ†Œλ¨ */

    /* μ ˆλŒ€ μ—¬κΈ°λ‘œ μ•ˆ 옴 */

    printf("thread_func(): not canceled!\n");
    return NULL;
}

int
main(void)
{
    pthread_t thr;
    void *res;
    int s;

    /* μŠ€λ ˆλ“œ μ‹œμž‘ν•˜κ³  μ·¨μ†Œ μš”μ²­μ„ 보내기 */

    s = pthread_create(&thr, NULL, &thread_func, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_create");

    sleep(2);           /* μŠ€λ ˆλ“œμ—κ²Œ μ‹œμž‘ν•  μ‹œκ°„ μ£ΌκΈ° */

    printf("main(): sending cancellation request\n");
    s = pthread_cancel(thr);
    if (s != 0)
        handle_error_en(s, "pthread_cancel");

    /* μŠ€λ ˆλ“œμ™€ ν•©λ₯˜ν•΄μ„œ μ’…λ£Œ μƒνƒœ 보기 */

    s = pthread_join(thr, &res);
    if (s != 0)
        handle_error_en(s, "pthread_join");

    if (res == PTHREAD_CANCELED)
        printf("main(): thread was canceled\n");
    else
        printf("main(): thread wasn't canceled (shouldn't happen!)\n");
    exit(EXIT_SUCCESS);
}

SEE ALSO

pthread_cleanup_push(3), pthread_create(3), pthread_exit(3), pthread_join(3), pthread_key_create(3), pthread_setcancelstate(3), pthread_setcanceltype(3), pthread_testcancel(3), pthreads(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️