Linux多线程3-1_线程终止

一、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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值