UNIX环境高级编程之----多线程技术(3)

pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。

(1)邦定属性。

在LINUX中,采用的是“一对一”的线程机制。也就是一个用户线程对应一个内核线程。邦定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程(轻量级进程)的,因此具有邦定属性的线程可以保证在需要的时候总有一个内核线程与之对应,而与之对应的非邦定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来分配。

(2)分离属性。

分离属性是决定以一个什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它多占用的线程没有得到释放,也就是没有真正的终止,需要通过pthread_join来释放资源。而在分离属性情况下,一个线程结束时会立即释放它所占有的系统资源。但这里有一点要注意的是,如果设置一个线程分离属性,而这个线程又运行得非常快的话,那么它很可能在pthread_create函数返回之前就终止了线程函数的运行,它终止以后就很有可能将线程号和系统资源移交给其他的线程使用,这时调用pthread_create的线程就得到错误的线程号。

这些属性都是通过一些函数来完成的,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。

1、pthread_attr_init

功能:        对线程属性变量的初始化。

头文件:     <pthread.h>

函数原型:   int pthread_attr_init (pthread_attr_t* attr);

函数传入值:attr:线程属性。

函数返回值:成功: 0

失败: -1

2、pthread_attr_setscope

功能:        设置线程绑定属性。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setscope (pthread_attr_t* attr, int scope);

函数传入值:attr: 线程属性。

scope:PTHREAD_SCOPE_SYSTEM(绑定)

PTHREAD_SCOPE_PROCESS(非绑定)

函数返回值得:同1。

3、pthread_attr_setdetachstate

功能:        设置线程分离属性。

头文件:      <phread.h>

函数原型:    int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);

函数传入值:attr:线程属性。

detachstate:PTHREAD_CREATE_DETACHED(分离)

PTHREAD_CREATE_JOINABLE(非分离)

函数返回值得:同1。

4、pthread_attr_getschedparam

功能:       得到线程优先级。

头文件:    <pthread.h>

函数原型:  int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性;

param:线程优先级;

函数返回值:同1。

5、pthread_attr_setschedparam

功能:       设置线程优先级。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性。

param:线程优先级。

函数返回值:同1。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>  

static void* pthread_func_1 (void*);
static void* pthread_func_2 (void*);  

int main (int argc, char** argv)
{
  pthread_t pt_1 = 0;
  pthread_t pt_2 = 0;
  pthread_attr_t attr = {0};
  int ret = 0;  

  pthread_attr_init (&attr); //属性设置
  pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
  pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);  

  ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);
  if (ret != 0)
  {
    perror ("pthread_1_create");
  }  

  ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);
  if (ret != 0)
  {
    perror ("pthread_2_create");
  }  

  pthread_join (pt_2, NULL);  

  return 0;
}  

static void* pthread_func_1 (void* data)
{
  int i = 0;  

  for (; i < 6; i++)
  {
    printf ("This is pthread_1.\n");  

    if (i == 2)
    {
      pthread_exit (0);
    }
  }  

  return;
}  

static void* pthread_func_2 (void* data)
{
  int i = 0;  

  for (; i < 3; i ++)
  {
    printf ("This is pthread_2.\n");
  }  

  return;
} 

[[email protected] linux_chen]$ cat  makefile

ALL= pthread

LIB= -lpthread

objects= linux1.o

$(ALL) : $(objects)

g++ -o [email protected] $(objects) $(LIB)

$(objects):%.o:%.cpp

$(CC)  -c  $< -o [email protected]

.PHONY : clean

clean:

rm $(objects)

运行结果:

This is pthread1!

This is pthread2!

This is pthread2!

This is pthread2!

This is pthread1!

This is pthread1!

从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 02:15:14

UNIX环境高级编程之----多线程技术(3)的相关文章

UNIX环境高级编程之----多线程技术(1)

进程是系统中程序执行和资源分配的基本单位.每个进程都有自己的数据段,代码段和堆栈段,这就导致了进程在进行切换等操作起到了现场保护作用.但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程演化中出现了另外一个概念,这就是线程,也被人称为轻量级的进程.它是一个进程内的基本调度单位.线程是在共享的内存空间中并发的多道执行路径,它们共享一个进程的资源,比如文件描述符和信号处理等.因此, 大大减少了上下文切换的开销. 线程跟进程一样,都拥有一张控制表,线程将相关的变量值放在线程控制表中

UNIX环境高级编程之----多线程同步学习

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 1.互斥锁(mutex) 通过锁机制实现线程间的同步.同一时刻只允许一个线程执行一个关键部分的代码. int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t*mutexattr); int pthread_mutex_lock(pthread_mutex *

《UNIX环境高级编程(第3版)》

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

UNIX环境高级编程笔记之文件I/O

一.看图说话 一图胜过千言,看图! 二.唠一唠 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样.很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了.所以,对于那些致力于想在Linux下做开发的人来说,

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX

(九) 一起学 Unix 环境高级编程 (APUE) 之 线程

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

(六) 一起学 Unix 环境高级编程(APUE) 之 进程控制

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 上一篇博文中我们讨论了进程环境,相信大家对进程已经有了初步的认识

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue