APUE学习之多线程编程(一):线程的创建和销毁
#include <pthread.h>
pthread_t pthread_self(void);
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_arrt_t *restrict addr, void *(*start_rtn)(void *), void *restrict arg);
#include "apue.h"
#include <pthread.h> pthread_t ntid; void printids(const char *s)
{
pid_t pid;
pthread_t tid; pid = getpid();
tid = pthread_self();
printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid, (unsigned long)tid, (unsigned long)tid);
} void *thr_fn(void *arg)
{
printids("new thread: ");
return ((void *));
} int main(void)
{
int err; err = pthread_create(&ntid, NULL, thr_fn, NULL);
if (err != )
{
err_exit(err, "can't create thread");
} printids("main thread: ");
sleep();
exit();
}
./a.out
main thread: pid tid (0xb75e36c0)
new thread: pid tid (0xb75e2b40)
#include <pthread.h>
void pthread_exit(void *rval_ptr);
ravl_ptr是无类型指针,进程中的其他线程可以通过pthread_join函数获得这个指针。
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
调用线程将一直阻塞,直至指定的线程退出,rval_ptr就包含返回码,如果线程被取消,rval_ptr指定的内存单元就设置为PTHREAD_CANCELED.可以通过调用pthread_join自动把线程置于分离状态,如果线程已处于分离状态,pthread_join就会调用失败。
#include "apue.h"
#include <pthread.h> void *thr_fn1(void *arg)
{
printf("thread 1 returning\n");
return (void *);
} void *thr_fn2(void *arg)
{
printf("thread 2 exiting\n");
pthread_exit((void *));
} int main(void)
{
int err;
pthread_t tid1, tid2;
void *tret; err = pthread_create(&tid1, NULL, thr_fn1, NULL); if (err != )
{
err_exit(err, "can't create thread1");
} err = pthread_create(&tid2, NULL, thr_fn2, NULL); if (err != )
{
err_exit(err, "can't create thread2");
} err = pthread_join(tid1, &tret); if (err != )
{
err_exit(err, "can't join thread1");
} printf("thread1 exit code:%ld\n", (long)tret); err = pthread_join(tid2, &tret); if (err != )
{
err_exit(err, "can't join thread2");
} printf("thread2 exit code:%ld\n", (long)tret); return ;
}
./a.out
thread exiting
thread returning
thread1 exit code:
thread2 exit code:
#include <pthread.h>
int pthread_cancel(pthread_t tid);
听着有点霸道,不过也只是请求而已,线程可以选择忽略这个请求。
#include <pthread.h>
void pthread_cleanup_push(void(*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
当线程执行以下动作时,清理函数rtn由pthread_cleanup_push函数调度
#include "apue.h"
#include <pthread.h> void cleanup(void *arg)
{
printf("cleanup: %s\n", (char *)arg);
} void *thr_fn1(void *arg)
{
printf("thread 1 start\n");
pthread_cleanup_push(cleanup, "thread 1 first handler");
pthread_cleanup_push(cleanup, "thread 1 second handler");
printf("thread 1 push complete\n"); if (arg)
{
return (void *);
} pthread_cleanup_pop();
pthread_cleanup_pop(); return (void *);
} void *thr_fn2(void *arg)
{
printf("thread 2 start\n");
pthread_cleanup_push(cleanup, "thread 2 first handler");
pthread_cleanup_push(cleanup, "thread 2 second handler");
printf("thread 2 push complete\n"); if (arg)
{
pthread_exit((void *));
} pthread_cleanup_pop();
pthread_cleanup_pop(); return (void *);
} int main(void)
{
int err;
pthread_t tid1, tid2;
void *tret; err = pthread_create(&tid1, NULL, thr_fn1, (void *));
if (err != )
{
err_exit(err, "can't create thread 1");
} err = pthread_create(&tid2, NULL, thr_fn2, (void *));
if (err != )
{
err_exit(err, "can't create thread 2");
} err = pthread_join(tid1, &tret);
if (err != )
{
err_exit(err, "can't join with thread 1");
}
printf("thread 1 exit code %ld\n", (long)tret); err = pthread_join(tid2, &tret);
if (err != )
{
err_exit(err, "can't join with thread 2");
}
printf("thread 2 exit code %ld\n", (long)tret); return ;
}
./a.out
thread start
thread push complete
cleanup: thread second handler
cleanup: thread first handler
thread start
thread push complete
thread exit code
thread exit code
#include <pthread.h>
int pthread_detach(pthread_t tid);
APUE学习之多线程编程(一):线程的创建和销毁的更多相关文章
- APUE学习之多线程编程(三):线程属性、同步属性
一.线程属性 可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ...
- APUE学习之多线程编程(二):线程同步
为了保证临界资源的安全性和可靠性,线程不得不使用锁,同一时间只允许一个或几个线程访问变量.常用的锁有互斥量,读写锁,条件变量 一.互斥量 互斥量是用pthrea ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
- vc 基于对话框多线程编程实例——线程之间的通信
vc基于对话框多线程编程实例——线程之间的通信 实例:
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...
随机推荐
- angular view之间的数据传递
之前写过一篇backbone view之间的传递,由于现在在用angular搞开发,现在也来总结一下.在angular 传递数据通俗的讲叫做 广播 ,在一些文章中,也叫做事件的发布与订阅,在angul ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色
系列目录 分配用户给角色,跟分配角色给用户操作是基本一致的. 打开模块维护,展开SysRole模块添加一个操作码,并赋予权限 设置好之后将权限授权给管理员,在SysRole的index添加操作码与js ...
- .NET Core下的日志(3):如何将日志消息输出到控制台上
当我们利用LoggerFactory创建一个Logger对象并利用它来实现日志记录,这个过程会产生一个日志消息,日志消息的流向取决于注册到LoggerFactory之上的LoggerProvider. ...
- Handler系列之创建子线程Handler
上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...
- svn迁移gitlab,构建前端打包发布流程
前端资源迁移 目前公司的前端资源托管在svn服务器上,由于团队的逐渐扩大,svn的分支管控越来越不灵活,而且对于以后前端流程一体化的处理支持不是很好,因此决定在版本控制上转向git.git的好 ...
- github常见问题【转自百度知道】
1 git config --global user.name "Your Real Name" 2 git config --global user.email you@emai ...
- iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权
iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...
- JavaScript RegExp 基础详谈
前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...
- 小试ASP.NET MVC——一个邀请页面的实现
上篇博客我们大体介绍了ASP.NET MVC以及如何去新建项目,这篇博客我们讲点干货.小试ASP.NET MVC,我们来写一个简单的邀请WEB. 先来建立一个Models,叫GuestResponse ...
- JDBC 练习
建立两个表,一个水果表一个用户表. 1.要求输入账号和密码,登陆成功显示欢迎界面,失败提示错误 2.显示选择界面,输入不同的数字,显示不同的内容,,并实现不同的功能,并返回界面 import java ...