C++11 条件变量(condition_variable) 使用详解

C++11 条件变量(condition_variable) 使用详解 - 小海哥哥de - 博客园 (cnblogs.com)

在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。

主要成员函数如下:

(651条消息) vsomeip-双机通信例子_vsomeip json配置_Sherry Baron的博客-CSDN博客
 

#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <chrono>             // std::chrono::seconds
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable, std::cv_status
 
std::condition_variable cv;
int value;
 
void do_read_value()
{
    std::cin >> value;
    cv.notify_one();
}
 
int main ()
{
    std::cout << "Please, enter an integer (I'll be printing dots): \n";
    std::thread th(do_read_value);
 
    std::mutex mtx;
    std::unique_lock<std::mutex> lck(mtx);
    while (cv.wait_for(lck,std::chrono::seconds(1)) == std::cv_status::timeout) {
        std::cout << '.';
        std::cout.flush();
    }
    std::cout << "You entered: " << value << '\n';
    th.join();
    return 0;
}


C++ std::condition_variable wait() wait_for() 区别 怎么用 实例_condition_variable wait_for-CSDN博客

 
  • std::unique_lock<std::mutex> its_lock(mutex);

    • condition.wait(its_lock);        //主线程不起作用,必须是子线程..





 

#include <condition_variable>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <thread>
#include <vsomeip/vsomeip.hpp>

#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x07
#define SAMPLE_EVENTGROUP_ID 0x5555
#define SAMPLE_EVENT_ID 9001

std::shared_ptr<vsomeip::application> app;
std::mutex mutex;
std::condition_variable condition;

void run() {
    std::unique_lock<std::mutex> its_lock(mutex);
    condition.wait(its_lock);
	//注册监听
    std::set<vsomeip::eventgroup_t> its_groups;
    its_groups.insert(SAMPLE_EVENTGROUP_ID);
    app->request_event(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_EVENT_ID, its_groups, true);
    app->request_event(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_EVENT_ID + 1, its_groups, true);
    app->subscribe(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_EVENTGROUP_ID);

    // Send Request
    std::shared_ptr<vsomeip::message> request;
    request = vsomeip::runtime::get()->create_request(true);
    request->set_service(SAMPLE_SERVICE_ID);
    request->set_instance(SAMPLE_INSTANCE_ID);
    request->set_method(SAMPLE_METHOD_ID);

    std::shared_ptr<vsomeip::payload> its_payload = vsomeip::runtime::get()->create_payload();
    std::vector<vsomeip::byte_t> its_payload_data;
    for (vsomeip::byte_t i = 0; i < 10; i++) {
        its_payload_data.push_back(i % 256);
    }
    its_payload->set_data(its_payload_data);
    request->set_payload(its_payload);
    app->send(request, true);
  
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    // send field request
    std::shared_ptr<vsomeip::message> request_filed;
    request_filed = vsomeip::runtime::get()->create_request(true);
    request_filed->set_service(SAMPLE_SERVICE_ID);
    request_filed->set_instance(SAMPLE_INSTANCE_ID);
    request_filed->set_method(SAMPLE_EVENT_ID);
    std::shared_ptr<vsomeip::payload> filed_payload = vsomeip::runtime::get()->create_payload();
    const vsomeip::byte_t its_data[] = {0x12};
    filed_payload->set_data(its_data, sizeof(its_data));
    request_filed->set_payload(filed_payload);
    app->send(request_filed, true);
}

void on_message(const std::shared_ptr<vsomeip::message>& _response) {
    std::stringstream its_message;
    its_message << "CLIENT: received a notification for event [" << std::setw(4)
                << std::setfill('0') << std::hex << _response->get_service() << "." << std::setw(4)
                << std::setfill('0') << std::hex << _response->get_instance() << "." << std::setw(4)
                << std::setfill('0') << std::hex << _response->get_method()
                << "message_type: " << std::hex << static_cast<int>(_response->get_message_type())
                << "] to Client/Session [" << std::setw(4) << std::setfill('0') << std::hex
                << _response->get_client() << "/" << std::setw(4) << std::setfill('0') << std::hex
                << _response->get_session() << "] = ";
    std::shared_ptr<vsomeip::payload> its_payload = _response->get_payload();
    its_message << "(" << std::dec << its_payload->get_length() << ") ";
    for (uint32_t i = 0; i < its_payload->get_length(); ++i)
        its_message << std::hex << std::setw(2) << std::setfill('0')
                    << (int)its_payload->get_data()[i] << " ";
    std::cout << its_message.str() << std::endl;

}

void on_availability(vsomeip::service_t _service, vsomeip::instance_t _instance,
                     bool _is_available) {
    std::cout << "CLIENT: Service [" << std::setw(4) << std::setfill('0') << std::hex << _service
              << "." << _instance << "] is " << (_is_available ? "available." : "NOT available.")
              << std::endl;
    if (_is_available) {
        condition.notify_one();
    }
}

void on_state_cbk(vsomeip::state_type_e _state) {
    std::cout << "on_state_cbk, state: " << static_cast<int>(_state) << std::endl;
    if (_state == vsomeip::state_type_e::ST_REGISTERED) {
        //注册成功后请求service,然后等待on_availability的callback
        // we are registered at the runtime now we can request the service
        // and wait for the on_availability callback to be called
        app->request_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
    }
}

int main() {
    app = vsomeip::runtime::get()->create_application("Hello");

    std::set<vsomeip::eventgroup_t> its_groups;
    its_groups.insert(SLAVE_EVENTGROUP_ID);

    app->init();

    //把这个application注册到路由管理器中,on_state_cbk:callback注册结果
    app->register_state_handler(on_state_cbk);

    app->register_availability_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, on_availability);
    app->register_message_handler(vsomeip::ANY_SERVICE, vsomeip::ANY_INSTANCE, vsomeip::ANY_METHOD,
                                  on_message);
    std::thread sender(run);
    app->start();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11中引入了condition_variable_any类,它是一个通用的条件变量类,可以用于实现线程的同步和互斥。condition_variable_any类提供了与pthread_cond_timedwait()函数类似的功能,可以在指定的时间内等待条件满足。 要使用condition_variable_any类实现pthread_cond_timedwait(),可以按照以下步骤进行操作: 1. 创建一个condition_variable_any对象和一个mutex对象,用于线程间的同步和互斥。 2. 在等待条件满足之前,使用unique_lock对mutex进行加锁。 3. 使用wait_until()函数等待条件满足或者超时。wait_until()函数接受一个时间点参数,表示等待的截止时间。 4. 在wait_until()函数返回之前,会自动释放mutex,并将线程置于等待状态。 5. 在其他线程中,当条件满足时,可以使用notify_one()或notify_all()函数来通知等待的线程。 6. 当wait_until()函数返回时,可以检查条件是否满足,如果满足则继续执行相应的操作,否则可以继续等待或者退出。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <thread> #include <condition_variable> std::condition_variable_any cv; std::mutex mtx; bool condition = false; void worker() { std::this_thread::sleep_for(std::chrono::seconds(2)); std::unique_lock<std::mutex> lock(mtx); condition = true; cv.notify_one(); } int main() { std::thread t(worker); std::unique_lock<std::mutex> lock(mtx); if (cv.wait_until(lock, std::chrono::system_clock::now() + std::chrono::seconds(5), []{ return condition; })) { std::cout << "Condition is satisfied!" << std::endl; } else { std::cout << "Timeout!" << std::endl; } t.join(); return 0; } ``` 在上面的示例中,主线程等待条件满足或者超时。在worker线程中,经过2秒后将条件设置为true,并通过notify_one()函数通知主线程。主线程使用wait_until()函数等待条件满足或者超时,如果条件满足则输出"Condition is satisfied!",否则输出"Timeout!"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值