[原创]手把手教你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;否则,返回一个错误代码指出错误的类型。 

 

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

目录
相关文章
|
11月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
444 0
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
456 67
|
11月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
809 5
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
670 13
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
588 20
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
334 17
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
552 1