一、exit是危险的
如果进程中的任意一个线程调用了exit,_Exit,_exit,那么整个进程就会终止
二、不终止进程的退出方式
普通的单个线程有一下3中方式退出,这样不会终止进程
(1)从启动例程中返回,返回值是线程的退出码
(2)线程可以被同一进程中的其他线程取消
(3)线程调用pthread_exit(void *rval)函数,rval是退出码
void pthread_exit(void *rval)
rval是个无类型的指针,保存线程的退出码,其他线程可以通过返回码链接这个线程
三、实例
1、几种退出方式
(1)程序架构
(2)源代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "include/pthread.h"
#ifndef _WIN64
#pragma comment(lib,".\\lib32\\pthreadVC2.lib")
//#pragma comment(lib,".\\lib32\\pthreadVCE2.lib")
//#pragma comment(lib,".\\lib32\\pthreadVSE2.lib")
#else
#pragma comment(lib,".\\lib64\\pthreadVC2.lib")
#endif // !
/*
几种退出方式
*DESCRIPTION: 验证几种线程到退出方式
*/
void *thread_fun(void* arg) {
//如果传到参数1,那么就采用return方式退出
if (strcmp("1",(char*)arg)==0)
{
printf("new thread return!\n");
return (void*)1;
}
//如果传到参数2,那么就采用pthread_exit退出
if (strcmp("2", (char*)arg) == 0)
{
printf("new thread pthread_exit!\n");
pthread_exit((void*)2);
}
//如果传到参数2,那么就采用pthread_exit退出
if (strcmp("3", (char*)arg) == 0)
{
printf("new thread exit!\n");
exit(3);
}
}
int main(int argc,char* argv[]) {
int err;
pthread_t tid;
srand((int)time(0));
int i = rand()%3;
printf("i是%d\n",i);
err = pthread_create(&tid, NULL, thread_fun, "2");
if (err!=0)
{
printf("creat new thread failed\n");
return 0;
}
Sleep(1);
printf("main thread\n");
return 0;
}
2、证明任意一个线程调用exit函数都会导致进程退出
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include "include/pthread.h"
#ifndef _WIN64
#pragma comment(lib,".\\lib32\\pthreadVC2.lib")
//#pragma comment(lib,".\\lib32\\pthreadVCE2.lib")
//#pragma comment(lib,".\\lib32\\pthreadVSE2.lib")
#else
#pragma comment(lib,".\\lib64\\pthreadVC2.lib")
#endif // !
/*
证明任意一个线程调用exit函数都会导致进程退出
*DESCRIPTION: 创建10 个线程,如果线程的参数和随机数相同,那么线程就采用exit方式退出
关于i的说明
参考博客
https://www.cnblogs.com/love-DanDan/p/8724245.html
i=*((int *)arg) 不可以
,线程之间共享一个用户空间,我们这样传递的是i的地址过去,然后在运行线程主函数的时候
依据地址找i的值,那么,问题出现了,cpu是个很快的男人,从main到线程主函数这之间有时间
差吧?所以,在那么点时间内,i的值发生改变了。
*/
int num;
void* thread_fun(void* arg) {
printf("i'm new thread :%d\n", (int*)arg);
//如果线程到参数arg和产生到随机数相同,那么线程就采用exit方式退出
//std::cout << *((int*)arg)<< std::endl;
if (num == (int)arg)
{
printf("new thread %d exit!!!\n",(int*)arg);
exit(0);
}
//否则线程睡眠,让其他线程执行
Sleep(2);
pthread_exit((void*)0);
return (void*)0;
}
int main() {
int err;
pthread_t tid;
//产生随机种子
srand((unsigned int)time(NULL));
//产生一个10以内的随机数
num = rand() % 11;
int i = 10;
//创建10个线程,每个线程传递参数i
//关于i没有取地址以及线程函数中的转换,在上面说明
while (i--)
{
err = pthread_create(&tid, NULL, thread_fun, (void*)i);
if (err!=0)
{
printf("creat new thread failed\n");
return 0;
}
}
Sleep(1);
system("pause");
return 0;
}