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,出错时返回各种错误码

restrict关键字是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;
    }
 <span style="background-color: rgb(255, 255, 0);">pthread_join(tid, 0);</span>//与上面程序的区别
    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;
}
时间: 2024-10-05 05:05:39

linux环境下的线程的创建问题的相关文章

[转]Linux环境下查看线程数的几种方法

1.cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H,或者直接输入 top -bH -d 3 -p  ${pid} top -H手册中说:-H : Threads toggle加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 4.ps xH手册中说:H Show threads as if they were processes这样可以查看所有存在的线程. 5.ps -mp <PID>手册中说

Linux环境下线程的同步与互斥以及死锁问题

由于本次要讨论操作系统的死锁问题,所以必须先研究的是linux环境下的线程同步与互斥 先看下面的代码 大家猜想输出应该是什么呢? 结果是下面这个样子 好吧,似乎并没有什么区别... 那么下面再看这段代码(请无视并忽略屏蔽的内容...) 大家猜想正确的结果是什么呢?5000,10000? 好吧,或许你们都错了. 在运行了一段时间后,它的结果是这样的. 是不是又对又错? 为什么呢? 这就是因为程序中printf语句作用:本身是库函数,所以必须进行系统调用,必须进入内核进行切换,有很大概率形成数据的混

多线程编程之Linux环境下的多线程(一)

一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程. 进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量).Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚.因此,Linux“线程”这个概念只有在打冒号的情况下才是

Linux环境下线程消息同步的陷阱

我们程序中常常会使用到线程间的消息同步处理,比如以下一段伪码 var message = "": void func()  {   1. 启动线程Thread(该线程中填充message的内容):   2. 阻塞,直到等待到完成message填充的事件:   3. 处理message:   .... } void Thread()  {   1. 通过某种处理填充message:   2. 触发func中的阻塞事件: } 我们通常会使用条件变量来完成类似情况的线程同步处理 比如wind

mosquitto在Linux环境下的部署/安装/使用/测试

mosquitto在Linux环境下的部署 看了有三四天的的源码,(当然没怎么好好看了),突然发现对mosquitto的源码有了一点点感觉,于是在第五天决定在Linux环境下部署mosquitto. 使用传统源码安装步骤: 步骤1:http://mosquitto.org/files/source/官网下载源码,放到Linux环境中.解压后,找到主要配置文件config.mk,其中包含mosquitto的安装选项,需要注意的是,默认情况下mosquitto的安装需要OpenSSL(一个强大的安全

多线程编程之Linux环境下的多线程(二)

上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了三种基本的同步机制:互斥.读写锁.条件变量.下面分别针对这三种机制进行说明: 一.线程互斥 互斥意味着具有“排它性”,即两个线程不能同时进入被互斥保护的代码.Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明

多线程编程之Linux环境下的多线程(三)

前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linux还是VxWorks,其涉及到多线程的部分都是那些内容,无非就是线程控制和线程通信,它们的许多函数只是名称不同,其实质含义是等价的,下面我们来列个三大操作系统共同点详细表单: 事项 WIN32 Linux VxWorks 线程创建 CreateThread pthread_create taskSp

linux环境下搭建MySQL数据库的双击热备

准备服务器 由于Mysql不同版本之间的(二进制日志)binlog格式可能会不太一样,因此最好的搭配组合是主(Master)服务器的Mysql版本和从(Slave)服务器版本相同或者更低,主服务器的版本肯定不能高于从服务器版本.本次我用于测试的两台服务器版本都是Mysql-5.5.17. Mysql 建立主-从服务器双机热备配置步骤 2.1环境描述A服务器(主服务器Master):59.151.15.36B服务器(从服务器Slave):218.206.70.146主从服务器的Mysql版本皆为5

(1)Jenkins Linux环境下的简单搭建

(1)Jenkins Linux环境下的简单搭建 Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. ----百度百科 这是一款基于Java开发的工具.种种原因,最近刚开始接触,决定研究一下.Jenkins的搭建方法不止一种,一下就是个人总结的其中一种,文章内容比较浅显,不足之处,欢迎指正. 首先,所需要准备的工具JDK.Maven.资料上显示JDK版本最好高于1.7,并没有研究1.7以下版本,所谓"没有实际调研,就没有发言权",在此就不做过多