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 ...
随机推荐
- JS设计模式(二)
5.迭代器模式 先实现一个简单的迭代器,类似于JQ里的$.each方法. var each = function (arr, callback) { for (var i = 0, l = arr.l ...
- Android笔记——Application的作用
一.Application是什么 Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象, ...
- 小知识:C#可选参数的一个陷阱
一.背景: 互联网行业,为了降低程序维护.升级的部署风险,往往会将程序拆分成很多项目,编译成多个dll部署,这样发布的时候,只需要部署修改过的dll即可. 二.问题: 有一个函数,在很多个地方被使 ...
- SQL Server 批量主分区备份(One Job)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 案例分析(Case) 实现代码(SQL Codes) 主分区完整.差异还原(Primary B ...
- SQL Server-分页方式、ISNULL与COALESCE性能分析(八)
前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...
- Elinq+Oracle
这份工作一直以来都用Oracle数据库,先前都是直接用的ADO.NET但是写包跟存储过程是一个很头疼的事情,满足不了快速开发的需求. 一直常识找比较好用的ORM,先前用的Entity Framewor ...
- oracle的特殊权限s bit丢失
在SUN Cluster搭建过程中,主机工程师在配置集群资源组时报一个oracle的文件权限错误: 协助排查,发现报错很明确,直接指出说oracle的s bit 权限未设置. 直接去查看$ORACLE ...
- 读书笔记--SQL必知必会14--组合查询
14.1 组合查询 复合查询(compound query)或并(union),SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回. 应用场景: 在一个查询中从不同的表返回 ...
- C#的Process类调用第三方插件实现PDF文件转SWF文件
在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用这个插件,并且该插件是如何将PDF文件转化为SWF文件的呢?接下来 ...
- SpingMVC 核心技术帮助文档
声明:本篇文档主要是用于参考帮助文档,没有实例,但几乎包含了SpringMVC 4.2版本的所有核心技术,当前最新版本是4.3,4.2的版本已经经是很新的了,所以非常值得大家一读,对于读完这篇文档感觉 ...