linux环境下的线程的创建问题
pthread_create函数用于创建一个线程
函数原型
#include<pthread.h>
int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void *),
void *restrict arg);
參数与返回值
tidp:类型为pthread_t的指针,当pthread_create成功返回时,该函数将线程ID存储在tidp指向的内存区域中
pthread_t:typedef unsigned long int pthread_t 。64位环境中是8字节无符号数。32位环境中是4字节无符号数
參数与返回值:
attr:用于定制各种不同的线程属性。
通常可设为NULL,採用默认线程属性
start_rtn:线程的入口函数。即新创建的线程从该函数開始运行。
该函数仅仅有一个參数,即arg。返回一个指针
arg:作为start_rtn的第一个參数
成功返回0,出错时返回各种错误码
restrictkeyword是C99标准引入的,仅仅能用于限定指针。表明指针是訪问一个数据对象的唯一且初始的方式
当中的cpp文件为
#include<pthread.h>
#include<iostream>
#include<unistd.h>
using namespace std;
void *thread(void *arg)
{
sleep(5);
long i = (long)arg;
cout << "in thread, tid = " << pthread_self() << endl;
cout << "arg is " << i << endl; return (void *)0;
}
int main()
{
pthread_t tid;
if(pthread_create(&tid, NULL, thread, (void *)2) != 0)
{
cout << "pthread_create error" << endl;
return 0;
}
return 0;
}
程序的结果是没有不论什么输出,其原因在于主线程先于新创建的线程退出,于是能够思考什么是主线程,怎么办?
解决方法是让主线程睡眠一段时间
>>pthread_join函数用于等待某个线程终止
函数原型
#include<pthread.h>
int pthread_join(pthread_t thread,
void **rval_ptr);
调用该函数的线程将一直堵塞。直到指定的线程退出
返回值与參数:
成功返回0,否则返回错误编号
thread:须要等待的线程ID
rval_ptr:
返回线程的退出码
若不关心线程返回值,可将该參数设置为NULL
#include<pthread.h>
#include<iostream>
#include<unistd.h>
using namespace std;
void *thread(void *arg)
{
sleep(5);
long i = (long)arg;
cout << "in thread, tid = " << pthread_self() << endl;
cout << "arg is " << i << endl; return (void *)0;
} int main()
{
pthread_t tid;
if(pthread_create(&tid, NULL, thread, (void *)2) != 0)
{
cout << "pthread_create error" << endl;
return 0;
}
pthread_join(tid, 0);//与上面程序的差别
return 0;
}
程序的结果为:
in thread, tid = 140125960128256
arg is 2
>>在默认情况下。线程的终止状态会保存到对该线程调用pthread_join
若线程已经处于分离状态。线程的底层存储资源能够在线程终止时马上被收回
当线程被分离时。并不能用pthread_join函数等待它的终止状态,此时pthread_join返回EINVAL
pthread_detach函数能够使线程进入分离状态
函数原型
#include<pthread.h>
int pthread_detach(pthread_t tid);
參数与返回值
tid:进入分离状态的线程的ID
成功返回0。出错返回错误编号
以下的实例:
若pthread_join比pthread_detach先调用,也能获取到退出信息
#include<pthread.h>
#include<iostream>
#include<unistd.h>
#include<errno.h>
using namespace std;
void *thread(void *arg)
{
cout << "in thread, tid = " << pthread_self() << endl;
sleep(2);
pthread_detach(pthread_self());
cout << "Hello World!" << endl;
sleep(2);
return (void *)0;
} int main()
{
pthread_t tid;
if(pthread_create(&tid, NULL, thread, 0) != 0)
{
cout << "pthread_create error" << endl;
return 0;
}
//sleep(2);2秒的话就没问题,4秒就join失败,2秒的时候<span style="font-size:12px;">pthread_join还是比pthread_detach先调用的</span>//cout<<"thread的值在上面"<< endl;
int *r;
int s = pthread_join(tid, (void **)&r);
if(s == EINVAL)
{
cout << "join error" << endl;
}
else
{
cout<<"r的值" << r << endl;
} cout << "in main thread, tid = " << pthread_self() << endl; return 0;
}
linux环境下的线程的创建问题的更多相关文章
- Linux环境下查看线程数的几种方法
1.cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H,或者直接输入 top -bH -d 3 -p ${pid} top ...
- [转]Linux环境下查看线程数的几种方法
1.cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H,或者直接输入 top -bH -d 3 -p ${pid} top ...
- Linux环境下,使用PHP创建一个守护进程
<?php $pid = pcntl_fork(); // fork if ($pid < 0) exit; else if ($pid) // parent exit; else { / ...
- 多线程编程之Linux环境下的多线程(一)
一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...
- Linux环境下C语言线程创建---简单代码
在Linux环境下用C语言编写线程创建. //file name: pthreadtext.c #include <stdio.h> #include <pthread.h> ...
- 多线程编程之Linux环境下的多线程(三)
前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linu ...
- 多线程编程之Linux环境下的多线程(二)
上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...
- mosquitto在Linux环境下的部署/安装/使用/测试
mosquitto在Linux环境下的部署 看了有三四天的的源码,(当然没怎么好好看了),突然发现对mosquitto的源码有了一点点感觉,于是在第五天决定在Linux环境下部署mosquitto. ...
- linux环境下使用jmeter进行压力测试
linux环境下使用jmeter进行压力测试 linux环境下使用就meter进行压力测试: linux环境部署: 在Linux服务器先安装jdk: 2.以jdk-8u172-linux-x64.ta ...
随机推荐
- nginx的反向代理和负载均衡的区别是什么 - 开源中国社区
nginx的反向代理和负载均衡的区别是什么 - 开源中国社区 nginx的反向代理和负载均衡的区别是什么 #user nobody;worker_processes 1;#error_log ...
- 让notepad.exe的utf8不添加BOM
实在是厌烦了notepad的utf8模式了,于是决定修改之,方案如下: 使用任何支持hex模式的编辑器打开%SystemRoot%/system32/notepad.exe查找二进制串56 8D 45 ...
- 斐讯K2 V22.X.X.X 新版固件 刷机教程 (开telnet,安装SSH,adbyby,刷breed,华硕Padavan)
源:http://www.right.com.cn/forum/thread-191833-1-1.html 属于我的上一个帖子的升级版,基本属于无脑操作,点击恢复就可以自动刷好breed,浏览上传新 ...
- mybatis 的简单使用
须要用到的包:(这里仅仅是当中一个版本号.其它的百度) mysql-connector-java-5.1.6-bin mybatis-3.2.2 先看项目文件夹: 配置文件mybatisconfig. ...
- android使用篇(四) 注解依赖注入IOC实现绑定控件
在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而 ...
- Java DatagramSocket(UDP)要注意的问题
因为byte数组的大小问题,在网络发送过程中.可能包括多余的空格,若接收时要对数据进行比較,最好先将数据做下处理,处理掉多余的空格.
- 使用AjaxFileUpload.js实现文件异步上�
ajax是无法提交文件的,所以在上传图片并预览的时候,我们常常使用Ifame的方法实现看似异步的效果.可是这样总不是非常方便的,AjaxFilleUpload.js对上面的方法进行了一个包装,使得我们 ...
- 无锁队列--基于linuxkfifo实现
一直想写一个无锁队列,为了提高项目的背景效率. 有机会看到linux核心kfifo.h 原则. 所以这个实现自己仿照,眼下linux我们应该能够提供外部接口. #ifndef _NO_LOCK_QUE ...
- phing用户手册第四章Getting Started译文
本章是phing的入门篇,查看 原文请猛击这里. XML And Phing 一个合法的Phing构建文件有以下几部分构成: 1.文档序言 2.唯一的根元素<project> 3.一些Ph ...
- remove()和直接使用system的一个差别
1.事出有因 今天在做一个从web页面中得到POST回应数据的时候.须要把暂时目录里面(包括子文件)内容清空.本来一直使用的是system("rmdir /s /q ..//tmp//dat ...