【原创】手把手教你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头文件的多线程编程知识,下一章中,我们继续讲解关于多线程的深入编程知识,敬请期待。

目录
相关文章
|
1月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
109 13
|
1月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
69 1
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
53 3
|
3月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
35 2
|
3月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
56 2
|
3月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
58 1
|
2月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
87 0
|
3月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
72 1
|
3月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
71 1