多线程的疑问
int state, oldstate, type, oldtype;
type = PTHREAD_CANCEL_ASYNCHRONOUS;
state = PTHREAD_CANCEL_ENABLE;
pthread_setcanceltype(type, &oldtype);
pthread_setcancelstate(state, &oldstate);
为什么创建的线程里要加上这几句?我自己做实验加不加实验结果一样啊?
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void * child1(void *arg)
{
int oldstate, oldtype;
int i = 0;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype);//comment 1
while (1)
{
}
}
int main()
{
pthread_t tid;
int rc;
void * status = NULL;
pthread_create(&tid, NULL, child1, NULL);
printf("\npthread_cancel \n");
pthread_cancel(tid);
printf("\nMain completed!~~\n");
return 0;
}
[解决办法]
int pthread_setcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为 NULL则存入原来的Cancel状态以便恢复。
int pthread_setcanceltype(int type, int *oldtype)
设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFERRED和 PTHREAD_CANCEL_ASYNCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和 立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。
此函数应该在线程开始时执行,若线程内部有任何资源申请等操作,应该选择 PTHREAD_CANCEL_DEFERRED 的设定,然后在退出点(pthread_testcancel 用于定义退出点)进行线程退出。
pthread_create(&tid, NULL, child1, NULL);// 第二个参数就是设置线程属性的
//你置NULL了肯定就没有反应了阿
[解决办法]
基础知识,manpage解决。
线程可取消,线程取消可以异步(随时)执行,无需取消点。