【原创】手把手教你Linux下的多线程设计--Linux下多线程编程详解(四)

简介: 本文可任意转载,但必须注明作者和出处。【原创】手把手教你Linux下的多线程设计(四)                                      --Linux下多线程编程详解 原创作者:Frozen_socker(冰棍)    E_mail:dlskyfly@163.com 线程同步  首先来看一下有关同步机制的概念。

本文可任意转载,但必须注明作者和出处。

【原创】手把手教你Linux下的多线程设计(四)
                                      --Linux下多线程编程详解
 
原创作者:Frozen_socker(冰棍)  
 E_mail:dlskyfly@163.com
 
线程同步
 
首先来看一下有关同步机制的概念。同步就是若干个线程等待某个事件的发生,当等待事件发生时,一起开始继续执行。可以这样简单理解同步,就是若干个线程各自对自己的数据进行处理,然后在某个点必须汇总一下数据,否则不能进行下一步的处理工作。
 
 
线程同步的函数调用有pthread_cond_init、pthread_cond_broadcast、pthread_cond_signal、pthread_cond_wait和pthread_cond_destroy
 
 
 
函数原型
int pthread_cond_init(pthread_cond_t * restrict cond,
          
const pthread_condattr_t *restrict attr);

函数说明:

按attr指定的属性初始化cond条件变量。如果attr为NULL,效果等同于pthread_cond_t cond = PTHREAD_COND_INITIALIZER

 

 

 

函数原型:

int pthread_cond_broadcast(pthread_cond_t *cond);


函数说明:
对所有等待cond这个条件变量的线程解除阻塞。

   

 

 

函数原型:

int pthread_cond_signal(pthread_cond_t *cond);


函数说明:
仅仅解除等待cond这个条件变量的某一个线程的阻塞状态。如果有若干线程挂起等待该条件变量,该调用只唤起一个线程,被唤起的线程是哪一个是不确定的。

  

 

 

函数原型:

int pthread_cond_wait(pthread_cond_t * restrict cond,
       pthread_mutex_t 
*restrict mutex);

函数说明:
该调用自动阻塞发出调用的当前线程,并等待由参数cond指定的条件变量,而且为参数mutex指定的互斥体解锁。被阻塞线程直到有其他线程调用pthread_cond_signal或pthread_cond_broadcast函数置相应的条件变量时,而且获得mutex互斥体才解除阻塞。等待状态下的线程不占用CPU时间。

   

 

 

函数原型:

int pthread_cond_timedwait(pthread_cond_t * restrict cond,
       pthread_mutex_t 
*
restrict mutex,
       
const struct timespec *restrict abstime);

函数说明:
该函数自动阻塞当前线程等待参数cond指定的条件变量,并为参数mutex指定的互斥体解锁。被阻塞的线程被唤起继续执行的条件是:有其他线程对条件变量cond调用pthread_cond_signal函数;或有其他线程对条件变量cond调用pthread_cond_broadcast;或系统时间到达abstime参数指定的时间;除了前面三个条件中要有一个被满足外,还要求该线程获得参数mutex指定的互斥体。

  

 

 

函数原型:

int pthread_cond_destroy(pthread_cond_t *cond);

函数说明:
释放cond条件变量占用的资源。

 

 

 

看下面的示例:

//example_5.c
#include <stdio.h>
#include 
<pthread.h>

pthread_t pt1,pt2;
pthread_mutex_t mu;
pthread_cond_t cond;
int i = 1 ;

void * decrease(void *
 arg)
...
{
    
while(1
)
    
...
{
        pthread_mutex_lock(
&
mu);
        
if(++
i)
        
...
{
            printf(
"%d  "
,i);
            
if(i != 1)    printf("Error  "
);
            pthread_cond_broadcast(
&
cond);
            pthread_cond_wait(
&cond,&
mu);
        }

        sleep(
1);
        pthread_mutex_unlock(
&
mu);
    }
    
}


void * increase(void *  arg)
...
{
    
while(1
)
    
...
{
        pthread_mutex_lock(
&
mu);
        
if(i--
)
        
...
{
            printf(
"%d  "
,i);
            
if(i != 0)    printf("Error  "
);
            pthread_cond_broadcast(
&
cond);
            pthread_cond_wait(
&cond,&
mu);
        }

        sleep(
1);
        pthread_mutex_unlock(
&
mu);
    }
    
}



int  main()
...
{
    pthread_create(
&
pt2,NULL,increase,NULL);
    pthread_create(
&
pt1,NULL,decrease,NULL);
    pthread_join(pt1,NULL);
    pthread_join(pt2,NULL);
}

  

 

  

 以上我们讲解过了Linux下利用pthread.h头文件的多线程编程知识,下一章中,我们继续讲解关于多线程的深入编程知识,敬请期待。

目录
相关文章
|
6天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
25 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
1天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
15 4
|
4天前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
17 6
|
9天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
8天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
27 10
|
5天前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
25 3
|
10天前
|
API Python
探索Python中的多线程编程
探索Python中的多线程编程
32 5
|
10天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
12天前
|
Java 开发者
Java中的多线程编程基础与实战
【9月更文挑战第6天】本文将通过深入浅出的方式,带领读者了解并掌握Java中的多线程编程。我们将从基础概念出发,逐步深入到代码实践,最后探讨多线程在实际应用中的优势和注意事项。无论你是初学者还是有一定经验的开发者,这篇文章都能让你对Java多线程有更全面的认识。
16 1
|
15天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。