linux线程程序设计,Linux 多线程编程

/*************************************************************************

> File Name: pthread.c

> Author: zhaoxiaohu

> Mail: 191711783@qq.com

> Created Time: Sat 21 Jul 2018 11:40:55 AM CST

************************************************************************/

#include

#include

#include

//#define THREAD

#define JOIN

void *thread1(void *arg)

{

pthread_detach(pthread_self());

int arr[1024] = {0};

printf("thread 1 is running go return\n");

return 1;

}

void *thread2(void *arg)

{

printf("thread 2 is running go exit\n");

pthread_exit((void *)5);

}

void *thread3(void *arg)

{

while(1){

sleep(1);

printf("thread 3 is running wait exit\n");

}

return NULL;

}

int main()

{

pthread_t tid1;

#ifdef THREAD

while(1)

{

if(!pthread_create(&tid1,NULL,thread1,NULL))

{

//pthread_join(tid1,NULL);

printf("create ok!!!\n");

}

else

printf("create error!!!\n");

}

#else

pthread_t tid2;

pthread_t tid3;

void *retval;

pthread_create(&tid1,NULL,thread1,NULL);//创建线程

#ifdef JOIN

pthread_join(tid1,&retval);

#endif

pthread_create(&tid2,NULL,thread2,NULL);

#ifdef JOIN

pthread_join(tid2,&retval);

printf("retval = %d\n",(int)retval);

#endif

pthread_create(&tid3,NULL,thread3,NULL);

#ifdef JOIN

pthread_join(tid3,&retval);

#endif

printf("i am main thread tid1 = %u,tid2 = %u,tid3 = %u\n",

(unsigned long) tid1,(unsigned long) tid2,(unsigned long) tid3);

sleep(3);

pthread_cancel(tid3);

sleep(10);

#endif

return 0;

}

1、当没有定义THREAD宏,定义JOIN

创建三个线程,每个线程都通过pthread_join(等待线程退出);运行结果:

b04cef7466b5d744efb14e7d8536f8fa.png

首先,创建三个线程,主线程分别用pthread_join等待其退出,因为pthread_join是阻塞等待,从而也就有先后顺序,从打印结果就可以看出;

2、当没有定义THREAD宏,没有定义JOIN

创建三个线程,后面加sleep;运行结果:

02109e4675767e85ff70bd8a870760b6.png

首先,创建三个线程,主线程没有用pthread_join等待其退出;如果没有加sleep,结果是:

ea069d95bfadd999cb6e38e482bab105.png

因为创建了线程,根本没有时间执行,为啥呢?(因为主线程(进程)执行完退出了,从而到处所有线程结束,没有时间执行)。

所以主线程要sleep几秒,让你创建的线程有机会执行;而且你可以看到,没有用pthread_join等待时,线程执行顺序是不确定的。

你还可以发现,线程三的执行函数是一个while,这里只打印了2句while里的函数,因为用了pthread_cancel(取消线程);后面的sleep10所有的线程都退出了但是资源没有释放(占空间)为啥这样说呢?看下面:

3、当定义了THREAD宏

这时,主线程是一个while 去创建线程

1)当线程执行函数中有pthread_detach(线程分离),此时线程资源自动释放,结果:

394bbb487f57109abee29b4d8a7273cb.png

2)当主线程用pthread_join(等待线程退出),此时结果:

9c58fca1bc7b28b59840bd7db095cb78.png

比较1)和2),一个自动释放资源不用主线程干预,一个主线程join,然后释放资源,而且可以看到join表现了阻塞和执行顺序。

3)当线程执行函数没有pthread_detach(线程分离)和主线程没有pthread_join(等待线程结束),运行结果:

41ac067e3d83bbdd5c018723079a5088.png

*为什么会出现create error;因为创建的线程有一个最大数,为啥呢:

一个程序到一个进程,从磁盘到虚拟内存的映射,而虚拟内存是有限的,32位,4g;而且1g个内核用了,所以用户只能使用3g,3g包含了代码段,数据段,堆栈,malloc的空间等,所以空间是有限;而每创建一个线程,默认分配8M的堆栈,所以当你没有释放资源时,空间肯定不够用,从而导致失败。(不是创建所有线程都失败,而是到那个最大值时出错的而失败的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值