linux线程篇,linux线程篇 (二) 线程的基本操作

线程

进程

标识符

pthread_t

pid_t

获取ID

pthread_self()

getpid()

创建

pthread_create()

fork

销毁

pthread_exit()

exit()

等待

pthread_join()

wait()

取消

pthread_cancel()

信号发送

pthread_kill()

kill() raise() alarm()

信号处理

signal

signal

信号屏蔽

pthread_sigmask()

线程清除

pthread_cleanup_push/pop

1.线程的创建

#include

pthread_t pthread_self(void); //返回自己的线程id

int pthread_create(pthread_t *thread,

const pthread_attr_t *attr,

void *(*start_routine) (void *),

void *arg);

//pthread_t *thread 新线程的id指针,注意是指针, pthread_t ntid; 这里就是 &tid

//const pthread_attr_t *attr, 新线程属性,这里暂为NULL

//void *(*start_routine) (void *), 新线程的函数入口

/*

* 描述:这是一个函数指针作为入口函数

* 参数:void * 指针类型

* 返回值为 void*

* (*start_routine) 这是一个指针变量,它指向一个函数,

因此在实参里本应该是&thread_fun

但是因为 函数名编译后,本身就是指针,所以可以隐去&

*/

//实例:pthread_creat(&ntid,NULL,&thread_fun,"我是给thread_fun的参数");

// void *thread_fun(void *arg){}

void pthread_exit(void *value_ptr);

2.线程的终止

单个线程的安全退出 ()

() 从启动线程中返回,返回值时线程的退出码

() 线程可以被同一进程中的其他线程取消

() 线程调用pthread_exit(void *rval),rval 是退出码

void pthread_exit(void *value_ptr);

3.线程的链接

#include

int pthread_join(pthread_t thread, void **value_ptr);

//该函数的线程会一直阻塞,直到 第一个参数的线程退出后,继续运行,第一个参数的线程退出码会被保存到第二个参数里,

//return 成功0 失败错误吗

//调用pthread_join 会让指定的线程处于分离状态,如果该线程已经是分离状态,那就会调用失败。

//

int pthread_detach(pthread_t thread); //线程分离,可以分离自己

4.线程取消

//取消线程

int pthread_cancel(pthread_t thread);

​//取消状态

int pthread_setcancelstate(int state, int *oldstate);

//PTHREAD_CANCEL_ENABLE 允许取消

//PTHREAD_CANCEL_DISABLE 不允许取消​

//取消类型

int pthread_setcanceltype(int type, int *oldtype);

//PTHREAD_CANCEL_DEFERRED 延迟取消

//PTHREAD_CANCEL_ASYNCHRONOUS 立即取消

​//取消点 如果是延时取消,那么在每一个取消点都会检查是否取消

5.线程信号

//1.信号的发送

int pthread_kill(pthread_t thread, int sig); //向线程发送信号

//return

// [ESRCH] thread is an invalid thread ID.

// [EINVAL] sig is an invalid or unsupported signal number.

//[ENOTSUP] thread was not created by pthread_create() and does not support being killed with

pthread_kill()

//信号的大部分操作是终止进程,所以要对信号作出正确的处理。

//2.信号的处理

int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);

struct sigaction {

union __sigaction_u __sigaction_u; /* signal handler */

sigset_t sa_mask; /* signal mask to apply */

int sa_flags; /* see signal options below */

};

union __sigaction_u {

void (*__sa_handler)(int);

void (*__sa_sigaction)(int, siginfo_t *,

void *);

};

//3.信号的屏蔽

int pthread_sigmask(int how, const sigset_t * restrict set, sigset_t * restrict oset);

6.进程的清除

//线程可以注册多个清理程序,入栈的形式 ,所以执行顺序和注册顺序相反

//注册清理程序

void pthread_cleanup_push(void (*cleanup_routine)(void *), void *arg);

//销毁清理程序

void pthread_cleanup_pop(int execute);

//响应方式

//1.pthreat_exit

//2.pthread_cancel

//3.调用 void pthread_cleanup_pop(int execute); 非零参数

C#线程篇---解答线程之惑(2)

我们都知道,在这个行业,追求的就是用最少的时间学最多的知识,这是我写这个系列最想达到的目标,在最快的时间内,帮助更多的人学习更多的线程知识. 前一篇,讲述了线程基础,给大家铺垫了一个基础,这一篇着重介 ...

linux c编程:线程互斥二 线程死锁

死锁就是不同的程序在运行时因为某种原因发生了阻塞,进而导致程序不能正常运行.阻塞程序的原因通常都是由于程序没有正确使用临界资源. 我们举个日常生活中的例子来比喻死锁.我们把马路上行驶的汽车比作运行着的 ...

linux线程篇 (三) 线程的同步

1 互斥量 pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthr ...

linux线程篇 (一) 线程的基本概念

--进程 一个正在执行的程序,资源分配的最小单位 进程中的事情需要按照一定顺序区执行的,但是如何在一个进程中让一些事情同时发生呢?子进程存在缺陷 --引进多线程 --线程:有时又称轻量级进程,程序执行 ...

linux进程篇 (二) 进程的基本控制

2. 进程的基本操作 接口函数 #include //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...

从零开始学Linux系统(二)之基本操作指令

ifconfigping ip地址帮助:ping -t ip地址ping -c 次数 ip地址ping -s 包的大小关机重启:shutdown -h now reboot清屏:clear  == C ...

Linux基础篇二:Bash shell(壳,命令解释器)介绍

shell执行方式: 第一:输入命令  (简单工作) 第二:   脚本  (适合大量工作) Bash shell 实际上的叫法是  GNU/Bash    如何查询呢:  bash - version ...

【转】C#线程篇

C# 温故而知新: 线程篇(一) C# 温故而知新: 线程篇(二) C# 温故而知新:线程篇(三) C# 温故而知新: 线程篇(四)

linux服务器开发二(系统编程)--线程相关

线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

随机推荐

CSS hack方式一览【转】

做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

promise的学习

为了解决回调地狱的问题,所以出现了promise的设计思想. promise的三种状态: pending 等待状态 resolved 完成状态 rejected 拒绝状态 promise的三种状态,只 ...

[Unity] Unity3D研究院编辑器之独立Inspector属性

本文转自: http://www.xuanyusong.com/archives/3680雨松MOMO Unity提供了强大的Editor功能, 我们可以很轻易的在EditorGUI中绘制任意的属性. ...

11-10 CC150第一章

题目: 1.1 Implement an algorithm to determine if a string has all unique characters. What if you can n ...

a标签中的label在IE下触发不了a标签的href链接(label标签——解析)

百度

内功心法 -- java.util.ArrayList<E> (3)

写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

UVA10723 电子人的基因 Cyborg Genes

题意翻译 [题目描述] 输入两个A~Z组成的字符串(长度均不超过30),找一个最短的串,使得输入的两个串均是它的子序列(不一定连续出现).你的程序还应统计长度最短的串的个数. e.g.:ABAAXGF ...

vue权威指南笔记02——对比v-if与v-show

...

Ubuntu下如何访问Windows磁盘?

有些同学的电脑原来是Windows系统的,但为了需要,又下载了一个Ubuntu系统,变成双系统的电脑. 但是,在Ubuntu下,Windows的磁盘是打不开的,用网盘或者U盘又是很不方便,所以ljn教 ...

Kali-linux免杀Payload生成工具Veil

Veil是一款利用Metasploit框架生成相兼容的Payload工具,并且在大多数网络环境中能绕过常见的杀毒软件.本节将介绍Veil工具的安装及使用. 在Kali Linux中,默认没有安装Vei ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值