美文网首页技术
多线程队列

多线程队列

作者: flycloud_hz | 来源:发表于2017-10-20 16:40 被阅读0次

0x0 队列在多线程中的应用
消息产生及消费一般在不同的线程,多线程需互斥访问队列。

0x1 代码实现
一个队列负责消息push/pop,多个线程产生/消费。

变量定义

bool g_running = false;
std::queue<std::string> g_queue;
pthread_t g_id;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;

线程从队列读取消息,进行处理;队列为空则等待。

while (g_running) {
    std::string msg;
    if (g_queue.empty()) {
        pthread_mutex_lock(&g_mutex);
        pthread_cond_wait(&g_cond, &g_mutex);
        if (g_running && !g_queue.empty()) {
            msg = g_queue.front();
            g_queue.pop();
        }
        pthread_mutex_unlock(&g_mutex);
    } else {
        pthread_mutex_lock(&g_mutex);
        if (g_running && !g_queue.empty()) {
            msg = g_queue.front();
            g_queue.pop();
        }
        pthread_mutex_unlock(&g_mutex);
    }

    if (g_running && !msg.empty()) {
        LOGE("msg %s", msg.c_str());
        // process msg

    }
}

消息插入队列

std::string msg;
if (g_running) {
    pthread_mutex_lock(&g_mutex);
    g_queue.push(std::string(msg));
    pthread_cond_signal(&g_cond);
    pthread_mutex_unlock(&g_mutex);
}

等待处理消息的线程退出

if (g_running) {
    g_running = false;
    pthread_mutex_lock(&g_mutex);
    pthread_cond_signal(&g_cond);
    pthread_mutex_unlock(&g_mutex);
    pthread_join(g_id, NULL);
}

0x2 如何提高性能
每次从队列取一个消息,都会调用锁,导致性能比较低下;更好的是调用队列swap函数,一个接收消息的队列,一个处理消息的队列,将接收消息队列的所有消息一次性传给处理消息的队列;这样会减少锁的调用次数,性能大幅提高。

相关文章

  • 队列和线程

    [iOS多线程中,队列和执行的排列组合结果分析] 多线程中的队列有:串行队列,并发队列,全局队列,主队列。 执行的...

  • 队列

    多线程队列 多进程队列

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • RocketMQ消息队列还没入门就想放弃

    题外话 什么情况下的异步操作需要使用消息队列而不是多线程? 消息队列和多线程两者并不冲突,多线程可以作为队列的生产...

  • IOS多线程

    ios中常见的多线程方案: 多线程容易混淆的术语: 多线程各种队列的执行效果: Syn 往当前的串行队列中添加任务...

  • c++ 实现 blocking queue

    阻塞队列就是多线程线程安全的队列,在多线程场景下经常用到,c++ 标准库里面没有提供阻塞队列,boost 中有提供...

  • iOS多线程之GCD

    相关文章:iOS多线程之NSThreadiOS多线程之NSOperations 队列 队列和线程是两个不同的概念。...

  • iOS 网络开发

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列自己创建主队列任务:block函数sync:同...

  • 多线程与网络 - 概况

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列主队列自己创建任务:block函数sync:同...

网友评论

    本文标题:多线程队列

    本文链接:https://www.haomeiwen.com/subject/ieuvuxtx.html