线程同步之semaphore信号量,代码实现

本文介绍了如何在任务处理线程池中利用semaphore进行线程同步,当任务监视线程添加任务到公共任务队列时,通过调用semaphore.post()唤醒等待的任务处理线程。线程执行体通过semaphore.pend()获取任务,无任务时线程会被阻塞。在实际应用中要注意对任务队列进行加锁同步,并结合关键段处理子线程间的互斥。
摘要由CSDN通过智能技术生成

一般在任务处理线程池中会有一个公共任务队列m_event_list,

任务监视线程有任务添加到m_event_list时,可以通过semaphore.post()增加信号量数来唤醒在semaphore信号量上的睡眠任务处理线程

简要代码为:

void add_event(Event &e)

{

    m_event_list.push_back(e);

    m_semaphore.post(); //唤醒在信号量队列上处于阻塞状态的任务处理线程来处理event

}

在每个任务线程的线程执行体threadProc()中,通过semaphore.pend()消费信号量来接收任务并处理任务,如果任务队列中没有任务要处理,则当前线程会被阻塞

简要代码为:

void threadProc()

{

    while(looping())

    {

        if (m_event_list.empty() != false) 

        {

            m_semaphore.pend();

            Event e = m_event_list.front();

            m_event_list.pop_front();

            handle_event(e);

        }//if

        //do other thing

    }//while

}

注:此处未做锁同步处理,在实际的使用过程当中一定要对m_event_list进行加锁同步。

注:还有一点,在实际项目中,主线程和子线程们之间用信号量进行同步,而用关键段来处理子线程们之间的互斥!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值