BOOST线程详解

线程的中断点

thread::join myThread::join调用这个方法的线程进入wait状态,直到myThread代表的线程完成
thread::try_join_for
thread::try_join_until
阻塞等待一定的时间段
   
condition_variable_any::wait wait(mu)
condition_variable_any::wait_for
condition_variable_any::wait_until
 
   
condition_variable_any::notify_one
condition_variable_any::notify_all
通知一个/所有等待中的线程
   
this_thread::sleep_for
this_thread::sleep_until
当前线程放弃时间片,指定堵塞时间,允许其他同优先级的线程运行,不释放资源
   
this_thread::yield 当前线程放弃时间片,不指定堵塞时间,允许其他同优先级的线程运行,不释放资源
   
   
thread::detach 分离线程
thread::interrupt 中断线程
互斥锁 boost::mutex mu
boost::mutex::scoped_lock lock(mu)
读写锁 boost::shared_mutex rw_mu
boost::shared_lock<boost::shared_mutex> lock(rw_mu)
条件量           boost::mutex ioMu
boost::condition_variable_any condPut
boost::mutex::scoped_lock lock(ioMu)
condPut.wait(ioMu)
condPut.notify_one()
   

互斥锁:

int g_num = 0;
boost::mutex mu;  //定义互斥锁对象

int Func(int nCount)
{
    for (int i = 0; i < nCount; i++)
    {
        boost::mutex::scoped_lock lock(mu);  //对共享数据进行操作,需加锁
        g_num++;
        //cout << __FUNCTION__ << ": " << g_num << endl;
        cout << boost::this_thread::get_id() << ":" << g_num << endl;
    }
    return g_num;
}

int _tmain(int argc, _TCHAR* argv[])
{
    boost::thread th1(Func, 100);
    boost::thread th2(Func, 200);
    th1.join();
    th2.join();

cout << boost::this_thread::get_id() << ":" << "main_end" << endl;

//th1和th2的执行顺序不定,不过一定是一个执行完毕后另一个才会执行,最后才是main_end

system("pause");
    return 0;
}

读写锁:

int g_num = 0;
boost::shared_mutex rw_mu;   //定义读写锁

int Write(int nCount)
{
    for (int i = 0; i < nCount; i++)
    {
        boost::unique_lock<boost::shared_mutex> lock(rw_mu);   //加唯一锁
        g_num++;
        //cout << __FUNCTION__ << ": " << g_num << endl;
        cout << boost::this_thread::get_id() << ": " << __FUNCTION__ << ": " << g_num << endl;
    }
    return g_num;
}

void Read(int nCount)
{
    for (int i = 0; i < nCount; i++)
    {
        boost::shared_lock<boost::shared_mutex> lock(rw_mu);  //加共享锁
        //cout << __FUNCTION__ << ": " << g_num << endl;
        cout << boost::this_thread::get_id() << ": " << __FUNCTION__ << ": (" << i << "):" << g_num << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    boost::thread th1(Write, 100);
    boost::thread th2(Read, 100);
    boost::thread th3(Read, 100);

th1.join();
    th2.join();
    th3.join();

system("pause");

return 0;
}

条件量:

boost::mutex g_ioMutex;    //输出控制锁

template<typename T>
class CMsgQueue
{
public:
    CMsgQueue(size_t n):m_nCapacity(n)
    {
    }

void Push(const T& val)
    {
        {
            boost::mutex::scoped_lock lock(m_mu);              //加锁
            while(m_val.size() == m_nCapacity)                 //队列已满
            {
                {
                    boost::mutex::scoped_lock lock(g_ioMutex);
                    cout << "队列已满" << endl;
                }
                m_condPush.wait(m_mu);                         //等待,将暂时的解锁
            }
            m_val.push(val);                                   //添加数据到队列
        }
        m_condPop.notify_one();                                 //通知读线程
    }

void Pop(T& val)
    {
        {
            boost::mutex::scoped_lock lock(m_mu);               //加锁
            while(m_val.size() == 0)                            //队列为空
            {
                {
                    boost::mutex::scoped_lock lock(g_ioMutex);
                    cout << "队列为空" << endl;
                }
                m_condPop.wait(m_mu);                           //等待可读,
            }
            val = m_val.front();                                 //读取数据
            m_val.pop();
        }
        m_condPush.notify_one();                                 //通知写线程
    }

private:
    queue<T> m_val;                            //队列
    int m_nCapacity;                           //队列最大容量
    boost::condition_variable_any m_condPush;  //写入条件量
    boost::condition_variable_any m_condPop;   //读取条件量
    boost::mutex m_mu;                         //互斥锁
};

CMsgQueue<int> g_numQueue(10);

void Push(int nCount)
{
    for (int i = 0; i < nCount; i++)
    {
        {
            boost::mutex::scoped_lock lock(g_ioMutex);
            cout << boost::this_thread::get_id() << ":" << __FUNCTION__ << " :Before_Push :" << i << endl;
        }   
        g_numQueue.Push(i);
    }
}

void Pop(int nCount)
{
    for (int i = 0; i < nCount; i++)
    {       
        int val;
        g_numQueue.Pop(val);
        boost::mutex::scoped_lock lock(g_ioMutex);
        cout << boost::this_thread::get_id() << ":" << __FUNCTION__ << " :After_Pop(" << i << "):" <<  val << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    boost::thread th1(Push, 50);
    boost::thread th2(Pop, 20);
    boost::thread th3(Pop, 30);

th1.join();
    th2.join();
    th3.join();

system("pause");

return 0;
}

未完待续…

时间: 2024-12-15 01:34:24

BOOST线程详解的相关文章

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

POSIX 线程详解(1-概述)

线程是有趣的 线程类似于进程.如同进程,线程由内核按时间分片进行管理.在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同.而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行. 那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可以读或写声明过的全局变量.如果曾用 fork() 编写过重要代码,就会认识到这个工具的重要性.为什么呢?虽然 fork() 允

POSIX 线程详解(2-线程创建和销毁)

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

python线程详解

#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threading.currentThread():返回当前的线程变量threading.enumerate():返回一个包含正在运行的线程的list,正在运行指:线程启动后,结束前,不包含启动前和终止后的线程threading.activeCount():返回正在运行的线程数量,与len(threading.en

POSIX 线程详解(3-互斥量:&quot;固定加锁层次&quot;/“试加锁-回退”)

有时一个互斥量是不够的: 比如: 当多个线程同时访问一个队列结构时,你需要2个互斥量,一个用来保护队列头,一个用来保护队列元素内的数据. 当为多线程建立一个树结构时,你可能需要为每个节点设置一个互斥量. 同时使用多个互斥量会导致复杂度的增加 最坏的情况就是死锁的发生,即两个线程分别锁住一个互斥量而等待对方的互斥量. 多互斥量可能导致死锁: 如果可以在独立的数据上使用两个分离的互斥量,那么就应该这么做.这样,通过减少线程必须等待其他线程完成数据操作的时间. 如果数据独立,则某个特定函数就不太可能经

C#网络编程基础之进程和线程详解

在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下baike. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动.它是操作系统动态执行的基本单元, 在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 线程:是"进程"中某个单一顺序的控制流. 关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到. 二:进程

“全栈2019”Java多线程第二十五章:生产者与消费者线程详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十五章:生产者与消费者线程详解 下一章 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"

KafkaProducer Sender 线程详解(含详细的执行流程图)

目录 1.Sender 线程详解 2.RecordAccumulator 核心方法详解 温馨提示:本文基于 Kafka 2.2.1 版本. 上文 <源码分析 Kafka 消息发送流程> 已经详细介绍了 KafkaProducer send 方法的流程,该方法只是将消息追加到 KafKaProducer 的缓存中,并未真正的向 broker 发送消息,本文将来探讨 Kafka 的 Sender 线程. @(本节目录) 在 KafkaProducer 中会启动一个单独的线程,其名称为 "

java 线程详解

5月7号  周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下:感觉收获还是挺多的:过段时间可能看完java  这几大块要去看一下关于spring boot  的内容顺便  也整理一下:附上我参考的 几本书: 关于java  线程,首先要了解一下线程和进程之间的关系.区别以及他们之间的概念: 首先是线程: 什么是线程? 线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程:线程是程序内的程序控制流只能使用程序内分配给程序