有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的;一种是排版不好,直接略过了。两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每个程序员都得了一种看别人不顺眼的病,哈哈。希望大家批评指正,我这个排版和总结有什么可优化的,绝对尽力而为。
本文主要介绍linux下线程的基本应用,列举了几个常用函数的用法及实例。
头文件 pthread.h
编译选项需要加 -pthread
 
线程创建函数原型:
 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数说明:
thread:线程ID
attr:线程属性,通常设为NULL(用到其他属性,再来补充)
start_route():线程入口函数
arg:线程入口函数参数
例:

 #include <stdio.h>
#include <unistd.h>
#include <pthread.h> void thread_function(void *param)
{
printf("this is a thread.\n");
}
int thread_test(void)
{
pthread_t thread_id;
int ret;
ret = pthread_create(&thread_id, NULL, (void *)&thread_function, NULL);
if(ret != ) {
printf("pthread_create fail\n");
return -;
} /*wait thread exit.*/
sleep();
return ;
}
int main(int argc, char *argv[])
{
thread_test();
return ;
}

此代码中存在一处内存泄漏问题,详情点击此处跳转。

线程退出函数原型:

 void pthread_exit(void *retval);
说明:
用于线程的主动退出,与return作用基本相同,但pthread_cleanup_push()和pthread_cleanup_pop()不接收return返回值。
若要在线程中终止另一个线程,需要用pthread_cancel();
参数说明:
retval:线程结束时的返回值,可由其他函数获取,如pthread_join()。
 
等待线程函数原型:
 int pthread_join(pthread_t thread, void **retval);
说明:
等待线程退出,在等待期间当前线程将被挂起。
参数说明:
thread:等待线程的ID
retval:等待线程的返回值
例:

 #include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void thread_function(void *param)
{
printf("this is a thread.\n");
sleep();
pthread_exit((void *));
}
int thread_test(void)
{
pthread_t thread_id;
int ret;
int *retval;
ret = pthread_create(&thread_id, NULL, (void *)&thread_function, NULL);
if(ret != ) {
printf("pthread_create fail\n");
return -;
}
ret = pthread_join(thread_id, (void *)&retval);
if(ret != ) {
printf("pthread_join fail\n");
return -;
}
printf("thread return value is %d\n", retval);
}
int main(int argc, char *argv[])
{
thread_test();
return ;
}
 
取消线程函数原型:
 int pthread_cancel(pthread_t thread);
说明:
在线程中终止另一个进程。
线程可以设置状态,来决定是否可以被其他线程取消(pthread_setcancelstate),默认可以被取消。
参数说明:
thread:要取消线程的ID
例:

 #include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_t thread1_id, thread2_id;
void thread_function1(void *param)
{
printf("this is a thread 2.\n");
while() {
printf("thread 1 is running.\n");
sleep();
}
printf("thread 1 exit.\n");
}
void thread_function2(void *param)
{
printf("this is a thread 2.\n");
sleep();
printf("thread 2 cancel thread 1.\n");
pthread_cancel(thread1_id);
}
int thread_test(void)
{
int ret;
ret = pthread_create(&thread1_id, NULL, (void *)&thread_function1, NULL);
if(ret != ) {
printf("pthread_create fail\n");
return -;
}
ret = pthread_create(&thread1_id, NULL, (void *)&thread_function2, NULL);
if(ret != ) {
printf("pthread_create fail\n");
return -;
}
ret = pthread_join(thread1_id, NULL);
if(ret != ) {
printf("pthread_join fail\n");
return -;
}
}
int main(int argc, char *argv[])
{
thread_test();
return ;
}

只是简单的介绍了下线程的基本操作,更高级的应用稍后更新敬请期待~~

linux线程(一)基本应用的更多相关文章

  1. [转载]Linux 线程实现机制分析

    本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...

  2. linux线程的实现

    首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...

  3. linux线程的实现【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...

  4. Linux线程-创建

    Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...

  5. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  6. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  7. Linux 线程(进程)数限制分析

    1.问题来源公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误:2.   初步原因分析和 ...

  8. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  9. linux 线程的内核栈是独立的还是共享父进程的?

    需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...

  10. Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程模型的比较:LinuxThreads 和 NPTL GNU_LIBPTHREAD_VERSION 宏 大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因 ...

随机推荐

  1. binutil 工具-----C分析工工具

    binutils-- a tools set * ld - the GNU linker. * as - the GNU assembler. * addr2line - Converts addre ...

  2. android 沉浸通知栏

    IOS的沉浸式通知栏很高大上,通知栏和app统一颜色或样式,很美观.android上面也早就人实现这种效果了. 我在这边也写一个实现通知栏沉浸式的方法,目前只实现了相同颜色. 先要改布局文件xml & ...

  3. 在其它路径新建cocos2d-x项目

    打开vs2010程序,然后选择“文件—新建—项目”,如图 改了一下位置,放在D:\Program Files\cocos2d-x\ ,确定 然后点下一步 这个程序不需要物理引擎,所以可以把上面红色的圈 ...

  4. Labview 中的类

    一.创建一个空的类 在 LabVIEW 工程窗口里,鼠标右键菜单的新建栏中有一项,是创建类.类的结构和 LabVIEW 工程库是比较相近的:类的名字也作为名字空间:也可以为类中的 VI 设置访问权限等 ...

  5. 转:XMLP报表导出为excel时设置文本不自动转为数字

    转自:http://yedward.net/?id=337 对于这个问题,只要在RTF模版中设置下强制LTR即可,设置方法如下: 图1:勾选强制LTR 也可以自己输入下面的代码: <fo:bid ...

  6. 万网免费主机wordpress快速建站教程-wordpress下载及安装

    进入wordpress官网(http://cn.wordpress.org)下载最新的wordpress安装程序,下载完成后解压到任意电脑目录. 解压完毕后,使用FTP管理工具上传安装文件至主机htd ...

  7. 3dmax使用K帧工具创建一个行走动作

    第一步,创建一个biped骨骼. 这个就不截图了,因为基本都会. 记住一点,先改变了关键点再去修改,不然修改的是前一个关键帧的动作. 第二步,开启自动关键帧,然后给初始位置双脚添加踩踏关键点.设置关键 ...

  8. java内存分块

     运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启 ...

  9. Android SDK目录含义介绍

    Android SDK目录的具体结构: 1.add-ons:该目录下存放第三方公司为Android平台开发的附加功能系统. 2.build-tools:编译工具.保存着一些通用工具,比如aapt.ai ...

  10. JDK+Tomcat+MyEclipse发布JSP项目——不能成功的问题

    JDK.Tomcat和MyEclipse安装完成后,在将web Project发布到Tomcat时出现金叹号,如图 原因:由于将Tomcat安装在C盘,所以需要启用管理员权限. 解决途径:用管理员身份 ...