开发者社区> gaoshouma> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

[原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

简介:  本文可任意转载,但必须注明作者和出处。 【原创】手把手教你Linux下的多线程设计(一)                                      --Linux下多线程编程详解  原创作者:Frozen_socker(冰棍)    E_mail:dlskyfly@163.com         线程也被称为轻权进程(lightweight process)。
+关注继续查看
 本文可任意转载,但必须注明作者和出处。
【原创】手把手教你Linux下的多线程设计(一)
                                      --Linux下多线程编程详解
 
原创作者:Frozen_socker(冰棍)  
 E_mail:dlskyfly@163.com       
 线程也被称为轻权进程(lightweight process)。
 
  在传统的UNIX上,一个进程让另一个实体做某个事务是用fork派生子进程的方法处理的。派生子进程的代价比线程要昂贵得多,尤其是在父子进程之间、子进程之间传递信息需要用IPC或其他方法通信。相对比,使用线程有许多优点,如创建线程要比创建进程快的多、一个进程中的线程共享相同的全局存储区等等。
 
   Linux系统下的多线程遵循POSIX线程接口,称为pthread,在Linux中,多线程需要使用的头文件为<pthread.h>,连接时需要使用库为libpthread.a。
 
 
 
我们编写一个非常简单的例子:
 
//example_1.c
#include <stdio.h>
#include 
<pthread.h>
 
void * pthread_func_test(void * arg);
 
int
 main()
...
{
     pthread_t pt1,pt2;
     pthread_create(
&pt1,NULL,pthread_func_test,"This is the Thread_ONE"
);
     pthread_create(
&pt2,NULL,pthread_func_test,"This is the Thread_TWO"
);
     sleep(
1);              //不加上这句,看不到结果。

}

void * pthread_func_test(void * arg)
...
{
     printf(
"%s /n "
,arg);
}
 
 
 
编译源文件:
gcc example_1.c -o example -lpthread
 
 
 
编译环境:
平   台:FC6
版   本:2.6.18-1.2798.fc6
编译器:gcc 4.1.1 20070105 (Red Hat 4.1.1-51)
 
 
 
 
运行可执行文件:
./example
 
 
 
在终端上的输出结果:
This is the Thread_ONE
This 
is the Thread_TWO
 
 
 
  在example_1这个例子中,一共产生了三个线程,第一个就是main所代表的主线程,另外两个就是pt1和pt2分别代表的两个分支线程,这两个线程由pthread_create函数创建,执行的内容就是写在函数pthread_func_test里的东东。
上例涉及到的函数是:pthread_create()
函数原型如下:
int pthread_create(pthread_t *restrict thread,
           
const pthread_attr_t *
restrict attr,
           
void *(*start_routine)(void*), void *restrict arg);
 
 
 
参数点解:
1、每个线程都有自己的ID即thread ID,可以简称tid,呵呵,是不是想起什么来了?。。。对,和pid有点象。其类型为pthread_t,pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
         typedef unsigned long int pthread_t;
         可以看成是线程的标志符。当成功创建一个新线程的时候,系统会为该线程分配一个tid,并将该值通过指针返回给调用它的程序。
2、attr申明线程的属性。                       
     属性结构为pthread_attr_t,它在头文件/usr/include/pthread.h中定义。设为NULL,表示在这里我们只使用线程的默认属性就可以了。
    
3、start_routine表示新创建的线程所要执行的例程。线程以调用该函数开始,直到由该函数返回(return)终止这个线程,或者在start_routine所指向的函数中调用pthread_exit函数终止。start_routine只有一个参数,该参数由随后的arg指针来指出。
 
4、arg:也是一个指针,也就是start_routine指针所指向的函数的参数。
 
 
 
返回值:

  当pthread_create调用成功时,该调用返回0;否则,返回一个错误代码指出错误的类型。 

 

       欢迎您发邮件与我交流,但因为工作和时间的关系,我有权对您提出的一些问题不予回答,敬请见谅。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十八)驱动设计的思想:面向对象/分层/分离
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十八)驱动设计的思想:面向对象/分层/分离
0 0
ZYNQ - 嵌入式Linux开发 -06- petalinux设计流程
ZYNQ - 嵌入式Linux开发 -06- petalinux设计流程
0 0
软件测试面试题:linux下的CP命令设计测试用例?
软件测试面试题:linux下的CP命令设计测试用例?
0 0
30道linux操作系统shell程序综合设计题
30道linux操作系统shell程序综合设计题
0 0
Linux文件系统设计简单了解
Linux文件系统设计简单了解
0 0
Linux 的发展历史,设计哲学和一些常用的术语介绍
Linux 的发展历史,设计哲学和一些常用的术语介绍
0 0
Linux高性能服务器设计
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,Dan Kegel提出了著名的C10问题:一台服务器上同时处理10000个客户网络连接。
1105 0
Linux高性能服务器设计
C10K和C10M 计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,Dan Kegel提出了著名的C10问题:一台服务器上同时处理10000个客户网络连接。
12723 0
+关注
gaoshouma
新人一枚
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载