Linux 应用基础 多线程编程

简介: 如果一个程序,你想实现按一下按键 就播放一首歌。可是呢?又担心按键程序会有延迟,不能及时的播放音乐。 这时,如果使用多进程编程,相当于出现了两个 main 函数,在这两个 main 函数之前要进行联络就需要使用相应的函数,就会造成很长时间的浪费。 如果,使用多线程编程,就会使两个功能在一个程序中,通过一个全局变量就可以实现联络,节省时间。

前言


什么是 多线程编程 呢?

大家写代码时可能遇到过一个问题,想实现两个事件,一个需要等待,另一个需要实时进行,这时候如果想两者都正常运行,就需要使用多线程编程了。


一、多线程编程概念


1 .实例:


如果一个程序,你想实现按一下按键 就播放一首歌。可是呢?又担心按键程序会有延迟,不能及时的播放音乐。 这时,如果使用多进程编程,相当于出现了两个 main 函数,在这两个 main 函数之前要进行联络就需要使用相应的函数,就会造成很长时间的浪费。 如果,使用多线程编程,就会使两个功能在一个程序中,通过一个全局变量就可以实现联络,节省时间。


2.多线程概述:


所谓线程,就是操作系统所能调度的最小单位。对于普通的进程,只有一个线程在执行对应的逻辑。我们可以通过多线程编程,使一个进程可以去执行多个不同的任务。


相比多进程编程而言,线程享有共享资源,即在进程中出现的全局变量,每个线程都可以去访问它,,使得系统资源消耗减少,可以提高 CPU 的使用率。


二、线程的使用


1. 线程的标识: pthread_t :


对于一个进程都有对应的一个 PID 号,而对于线程有着一个类似的PID号, 是 tid (线程号)。可以通过函数 pthread_self,来返回当前线程的线程号。


#include <pthread.h>
  pthread_t tid = pthread_self();//获取主线程的tid号


2.查看线程数 , 进程号:


(1). 在 ps 命令中,“-T” 选项可以开启进程查看。


[root@100ask:/mnt]#
[root@100ask:/mnt]# ps - T
PID   USER     COMMAND


(2). 通过 cat /proc/进程号/status | grep Threads 查看线程号。

Threads 后面的是线程数。


[root@100ask:/mnt]#
[root@100ask:/mnt]# cat /proc/390/status | grep Threads
Threads:        3
[root@100ask:/mnt]#



3. 创建线程:

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

1

pthread :指针,用来保存新建线程的线程号 ( tid ).

第二个参数表示了线程的属性,一般传入NULL表示默认属性.

第三个参数是一个函数指针,就是线程执行的函数.


void *fun(void *arg)
  {
    printf("pthread_New = %lu\n",(unsigned long)pthread_self());//打印线程的tid号
  }
  int main()
  {
  pthread_t tid1;
  pthread_create(&tid1,NULL,fun,NULL);//创建线程
  }


三. 互斥量


当多个线程 A , B 都想访问一块空间时,为保证这块空间数据的可靠性,不被随意改变,就要使用一把锁将其空间锁住。 A 要访问时,就锁住,则 B 就不可随意改变其数值。等到 A 结束后,再将其打开,B就可以访问。反之,一样。 这就是需要用到 互斥量。


1. 互斥量的初始化:
pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;
1
2
2. 互斥量加锁/解锁:
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
1
2
3
4

成功:返回0


四. 条件变量


条件变量时一种同步机制,用来通知其他线程条件满足了。一般是用来通知对方共享数据的状态信息,因此条件变量时结合互斥量来使用的。


1. 条件变量的初始化:
pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;
1
2
2. 休眠等待 (等待条件变量):
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
1
3. 通知条件变量:
int pthread_cond_signal(pthread_cond_t *cond);
1

总结

多线程编程在实际工作会用很多,希望大家好好理解一下。不清楚的欢迎留言讨论


相关文章
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
1天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
9 3
|
3天前
|
监控 安全 Java
Java多线程编程的艺术与实践
【10月更文挑战第22天】 在现代软件开发中,多线程编程是一项不可或缺的技能。本文将深入探讨Java多线程编程的核心概念、常见问题以及最佳实践,帮助开发者掌握这一强大的工具。我们将从基础概念入手,逐步深入到高级主题,包括线程的创建与管理、同步机制、线程池的使用等。通过实际案例分析,本文旨在提供一种系统化的学习方法,使读者能够在实际项目中灵活运用多线程技术。
|
1天前
|
缓存 安全 Java
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文将深入探讨Java中的多线程编程,包括其基本原理、实现方式以及常见问题。我们将从简单的线程创建开始,逐步深入了解线程的生命周期、同步机制、并发工具类等高级主题。通过实际案例和代码示例,帮助读者掌握多线程编程的核心概念和技术,提高程序的性能和可靠性。
8 2
|
2天前
|
Java
Java中的多线程编程:从基础到实践
本文深入探讨Java多线程编程,首先介绍多线程的基本概念和重要性,接着详细讲解如何在Java中创建和管理线程,最后通过实例演示多线程的实际应用。文章旨在帮助读者理解多线程的核心原理,掌握基本的多线程操作,并能够在实际项目中灵活运用多线程技术。
|
5天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
2天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
20 3
|
4天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
5天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。