linux线程--基本应用

有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的;一种是排版不好,直接略过了。两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每个程序员都得了一种看别人不顺眼的病,哈哈。希望大家批评指正,我这个排版和总结有什么可优化的,绝对尽力而为。

本文主要介绍linux下线程的基本应用,列举了几个常用函数的用法及实例。

头文件 pthread.h

编译选项需要加 -pthread

常用函数

线程创建函数原型:

1 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

参数说明:

thread:线程ID

attr:线程属性,通常设为NULL(用到其他属性,再来补充)

start_route():线程入口函数

arg:线程入口函数参数

例:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4
 5 void thread_function(void *param)
 6 {
 7     printf("this is a thread.\n");
 8 }
 9 int thread_test(void)
10 {
11     pthread_t thread_id;
12     int ret;
13     ret = pthread_create(&thread_id, NULL, (void *)&thread_function, NULL);
14     if(ret != 0) {
15         printf("pthread_create fail\n");
16         return -1;
17     }
18
19     /*主要是为了看到线程的打印*/
20     sleep(1);
21
22 }
23 int main(int argc, char *argv[])
24 {
25     thread_test();
26     return 0;
27 }

线程退出函数原型:

1 void pthread_exit(void *retval);

说明:

用于线程的主动退出,与return作用基本相同,但pthread_cleanup_push()和pthread_cleanup_pop()不接收return返回值。

若要在线程中终止另一个线程,需要用pthread_cancel();

参数说明:

retval:线程结束时的返回值,可由其他函数获取,如pthread_join()。

等待线程函数原型:

1 int pthread_join(pthread_t thread, void **retval);

说明:

等待线程退出,在等待期间当前线程将被挂起。

参数说明:

thread:等待线程的ID

retval:等待线程的返回值

例:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4 pthread_t thread1_id, thread2_id;
 5 void thread_function1(void *param)
 6 {
 7     printf("this is a thread 2.\n");
 8     while(1) {
 9         printf("thread 1 is running.\n");
10         sleep(1);
11     }
12     printf("thread 1 exit.\n");
13 }
14 void thread_function2(void *param)
15 {
16     printf("this is a thread 2.\n");
17     sleep(2);
18     printf("thread 2 cancel thread 1.\n");
19     pthread_cancel(thread1_id);
20 }
21 int thread_test(void)
22 {
23     int ret;
24     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function1, NULL);
25     if(ret != 0) {
26         printf("pthread_create fail\n");
27         return -1;
28     }
29     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function2, NULL);
30     if(ret != 0) {
31         printf("pthread_create fail\n");
32         return -1;
33     }
34     ret = pthread_join(thread1_id, NULL);
35     if(ret != 0) {
36         printf("pthread_join fail\n");
37         return -1;
38     }
39 }
40 int main(int argc, char *argv[])
41 {
42     thread_test();
43     return 0;
44 }

取消线程函数原型:

1 int pthread_cancel(pthread_t thread);

说明:

在线程中终止另一个进程。

线程可以设置状态,来决定是否可以被其他线程取消(pthread_setcancelstate),默认可以被取消。

参数说明:

thread:要取消线程的ID

例:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4 pthread_t thread1_id, thread2_id;
 5 void thread_function1(void *param)
 6 {
 7     printf("this is a thread 2.\n");
 8     while(1) {
 9         printf("thread 1 is running.\n");
10         sleep(1);
11     }
12     printf("thread 1 exit.\n");
13 }
14 void thread_function2(void *param)
15 {
16     printf("this is a thread 2.\n");
17     sleep(2);
18     printf("thread 2 cancel thread 1.\n");
19     pthread_cancel(thread1_id);
20 }
21 int thread_test(void)
22 {
23     int ret;
24     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function1, NULL);
25     if(ret != 0) {
26         printf("pthread_create fail\n");
27         return -1;
28     }
29     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function2, NULL);
30     if(ret != 0) {
31         printf("pthread_create fail\n");
32         return -1;
33     }
34     ret = pthread_join(thread1_id, NULL);
35     if(ret != 0) {
36         printf("pthread_join fail\n");
37         return -1;
38     }
39 }
40 int main(int argc, char *argv[])
41 {
42     thread_test();
43     return 0;
44 }

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

时间: 2024-10-08 19:06:53

linux线程--基本应用的相关文章

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

本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的. 一.基础知识:线程和进程 按照教科书上的定义,进

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

linux线程(二)内存释放

linux线程有两种模式joinable和unjoinable. joinable线程:系统会保存线程资源(栈.ID.退出状态等)直到线程退出并且被其他线程join. unjoinable线程:系统会在线程退出时自动回收线程资源. linux线程创建后默认为joinable模式,因此线程退出时不会释放资源.若程序中大量的创建线程并未处理,则会导致内存泄漏,最终将导致不能继续创建线程. 应用举例: 1. 一般情况我们并不关注线程的状态,只是让其执行一些操作,所以要将线程设为unjoinable.实

linux线程

linux线程私有的部分:每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器 linux进程切换时通过TSS段,TSS中的esp0和ss0都是系统初始化设置的,指向进程创建时候,分配的栈空间.当进程切换的时候,在内核态下才进行进程切换,在0.11版本中,当前进程的寄存器被压入当前进程的TSS中,然后利用长跳转指令来到下一个TSS中,把这个TSS中的寄存器数据全给赋给寄存器(用于恢复寄存器)

Linux 线程模型的比较:LinuxThreads 与 NPTL

Linux 线程模型的比较:LinuxThreads 与 NPTL 本文参照来源:IBM开发者论坛 前奏:关于POSIX 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945.此标准源于一个大约开始于1985年的项目.POSIX这个名称是由理查德·斯托曼应IEE

Linux 线程 条件变量

下面是一个多线程,生产者消费者问题,一个队列放暂存的数据: 1 #include <iostream> 2 #include <queue> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <pthread.h> 6 7 using std::cout; 8 using std::endl; 9 using std::queue; 10 11 #define N 100 12 #def

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

1.问题来源 公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误: 2.   初步原因分析和解决 让运维的兄弟在服务上查看内存.CPU.网络.IO等基本信息都正常.于是自己到运维的服务器上看了一下,下面是slabtop –s c的运行结果,问题初步原因貌似出现了: 如果看到这个截图你看不出什么异常的话,下面的内容你可能不感兴趣,哈哈... task_struct是内核对进程的管理单位,

linux线程的实现

http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 轻量级进程 轻量级线程(LWP)是一种由内核支持的用户线程.它是基于内核线程的高级

linux线程资源回收

from:http://blog.csdn.net/skyflying2012/article/details/24655751及相关论坛 http://blog.chinaunix.net/uid-29783732-id-4485673.html 在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,我实现方式比较傻,死循环等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题. Li

浅析Linux线程中数据

本文首先概述了线程中有哪些数据私有的,以及进程中哪些数据线程是共享的,然后详细分析了线程在用户空间中的数据,最后通过一个多线程程序来分析线程中的数据分布. 概述 线程包含了表示进程内执行环境必需的信息,其中包括进程中标识的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字(每个线程有自己的信号屏蔽字,但对某个信号的处理方式是进程中所有线程共享的).errno变量(每个线程都自己的局部errno)以及线程私有数据.进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本.程序的全局内