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

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
完成端口是一种异步输入/输出(I/O)模型,在网络编程中起到了重要的作用。它是Windows操作系统中提供的一种高效的I/O完成机制。 完成端口的工作方式是通过一个预先创建的I/O完成端口对象来管理I/O操作。在应用程序中,可以创建多个完成端口对象,用于不同的I/O操作。完成端口对象会与一个执行线程相关联,这个线程会在I/O操作完成时被唤醒。当一个I/O操作完成时,操作系统会将完成的消息发送给完成端口对象,并唤醒相应的线程。 使用完成端口的好处是可以实现高效的并发I/O操作。通过使用线程池,可以有效地处理多个客户端请求,并且不会因为等待I/O操作而造成线程的闲置。此外,完成端口还可以用于实现高性能的服务器应用程序,因为它能够轻松地处理大量的并发I/O操作。 完成端口的使用步骤如下: 1. 创建完成端口对象,并绑定执行线程。 2. 创建一个I/O请求(例如读取或写入操作)。 3. 将I/O请求与完成端口对象关联。 4. 执行I/O操作,并等待操作完成。 5. 当操作完成时,线程被唤醒,并处理完成的I/O请求。 总之,完成端口是一种强大而高效的I/O完成机制,在网络编程中非常实用。它能够提供高并发的I/O操作能力,使得应用程序能够高效地处理多个客户端请求。通过合理地利用完成端口,在网络编程中可以实现高性能和高效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值