pthread_cancel 함수 주의사항
/**************************************************
:
#include
int pthread_cancel(pthread_t thread)
0,
**************************************************/
POSIX ,
, !
!
:
/ / ....
, ,
, .
, :
/**************************************************
#include
void pthread_cleanup_push(void (*routine)(void *), void *arg)
void pthread_cleanup_pop(int execute)
:routine ,arg routine
execute , ,
。
**************************************************/
, atexit ,
,
( ):
1. pthread_exit(void *) 。
2. 。
3. pthread_cleanup_pop ,execute 。
, ,
。
:
!
#include
#include
#include
#include
#include
#include
#include
#include
#include
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
void *count(void *arg)
{
int i=1;
while(1)
{
sleep(1);
printf("sec: %d
", i++);
}
}
void handler(void *arg)
{
printf("[%u] is cancelled.
", (unsigned)pthread_self());
pthread_mutex_t *pm = (pthread_mutex_t *)arg;
pthread_mutex_unlock(pm);
}
void *routine(void *arg)
{
#ifdef CLEANUP
pthread_cleanup_push(handler, (void *)&m);
#endif
pthread_mutex_lock(&m);
printf("[%u] lock the mutex!
", (unsigned)pthread_self());
/*
** During sleep(), if the calling thread received a cancel-
** request and HASN'T established any cleanup handlers to
** unlock the mutex, it will leave the mutex a DEAD-LOCK
** state.
*/
sleep(2);
printf("[%u]: job finished!
", (unsigned)pthread_self());
pthread_mutex_unlock(&m);
printf("[%u] unlock the mutex!
", (unsigned)pthread_self());
/*
** NOTE:
**
** pthread_cleanup_push() and pthread_cleanup_pop() may be
** implemented as macro that expand to text containing '{'
** and '}', respectively. For this reason, the caller must
** user them pairly and ensure that they are paired within
** a same function and at the same lexical nesting level.
*/
#ifdef CLEANUP
pthread_cleanup_pop(0);
#endif
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
pthread_t t, t1, t2;
pthread_create(&t, NULL, count, NULL);
pthread_create(&t1, NULL, routine, NULL);
pthread_create(&t2, NULL, routine, NULL);
printf("[%u] ==> t1
", (unsigned)t1);
printf("[%u] ==> t2
", (unsigned)t2);
printf("[%u] ==> main
", (unsigned)pthread_self());
sleep(1);
pthread_cancel(t1);
pthread_cancel(t2);
sleep(2);
pthread_mutex_lock(&m);
printf("[%u] locked the mutex!
",
(unsigned)pthread_self());
pthread_mutex_unlock(&m);
exit(0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 프로그램과 C 언어의 차이에 대한 간단한 분석C 언어를 배운 우리에게 자바는 비교적 간단한 프로그래밍 언어라고 할 수 있다. Java 언어에서는 모든 변수를 먼저 선언해야 사용할 수 있습니다. 그렇지 않으면 프로그램이 실행될 수 없습니다.하나의 C 언어는 몇 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.