条件变量详解

概述

条件变量是限制线程执行的一种机制,即在某些条件满足之前限制线程的执行。这种限制的目的,大多是为了减少线程之间信息闭塞,达到线程同步,从而提高线程之间的通信效率。

线程中访问共享数据的代码常常带有一定的逻辑顺序(如数据的添加和删除)。而条件变量的目的就是将这些线程之间的代码的执行与逻辑顺序相吻合,从而避免线程不断的if判断是否达到执行要求。举个贴近的生活,你和你的好兄弟一起请求班上的好学生帮你们写作业,你好兄弟的作业先写,然后再写你的,着急的你一直询问好学生是不是轮到你了,这样会不会让好学生很烦!!!因此就应该等你的好兄弟拿到作业后再由他通知你该你的作业了。

std::condition_variable

std::condition_variable(条件变量)是C++11引入的一个类,通常与互斥量一起使用,确保共享数据安全并同步线程。使用std::condition_variable要使用#include<condition_variable>将头文件包含进来。

std::condition_variable主要通过wait()、notify_one()、notify_all()三个成员实现以上功能。wait()可以接收一个shared_lock<std::mutex>类型的参数,当线程执行到std::condition_variable成员调用wait()时,线程就会被阻塞到本行代码,同时释放锁。等待其他线程调用notify_one()通知其可以继续执行,或者调用notify_all()通知所有被该条件变量阻塞的线程继续执行。当wait()被唤醒后,就会不断尝试获取锁。直到获得锁后,才会执行后续代码。如果线程并未被阻塞或者并未被wait()阻塞,其他线程调用notify_one()或者notify_all()对其不起作用。

#include<iostream>
#include<thread>
#include<list>
#include<mutex>
#include<condition_variable>
using namespace std;
class A
{
private:
    mutex mymutex;
    list<int> mydata;
    condition_variable mycond;
public:
    void indata()
    {
        for (int i = 0; i < 1000; i++)
        {
            unique_lock<mutex> mylock(mymutex);
            mydata.push_back(i);
            mycond.notify_one();
        }
    }
    void outdata()
    {
        for (int i = 0; i < 1000; i++)
        {
            unique_lock<mutex> mylock(mymutex);
            mycond.wait(mylock);
            mydata.pop_front();
        }
    }
};

int main()
{
    A a;
    thread myinthread(&A::indata ,&a );
    thread myoutthread(&A::outdata,&a);
    myinthread.join();
    myoutthread.join();
    
}

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
nginx全局变量配置详解如下: 在nginx的配置文件中,可以使用全局变量来实现一些配置的判断和处理。全局变量在整个nginx配置中都是可见的,可以在不同的上下文中使用。 在引用中的示例中,主要使用了两个全局变量:$host和$request_uri。$host表示当前请求的主机名,$request_uri表示当前请求的URI。通过这些全局变量的值,可以进行条件判断和重定向跳转等操作。 另外,在nginx的配置中,还可以使用其他一些全局变量,例如: - $remote_addr:客户端的IP地址 - $http_user_agent:客户端的User-Agent信息 - $http_referer:客户端的Referer信息 $args:查询参数部分 - $scheme:请求的协议(http或https) 除了使用这些内置的全局变量外,还可以通过自定义变量来扩展nginx的功能。可以使用set指令来定义变量,并在配置中使用。 在nginx的全局配置中,可以使用全局块、events块和http块来进行配置。全局块中的配置影响全局,包括运行nginx的用户组、进程存放、日志、配置文件等。events块用于配置nginx服务器与客户端的网络连接,包括进程最大连接数、数据驱动模型、序列化等。http块是最常用的配置块,用于配置代理、缓存、日志和第三方模块等。 在http块中,可以嵌套多个server块,每个server块表示一个虚拟主机的参数配置。而在server块中,可以使用location块来配置请求路由和页面处理。 综上所述,nginx全局变量配置详解如上所述,主要包括内置的全局变量和自定义变量的使用,以及全局块、events块和http块的配置结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Nginx 配置详解](https://blog.csdn.net/u011262253/article/details/120941175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值