condition_variable与多线程,互斥锁

简介: condition_variable与多线程,互斥锁
// condition.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <mutex>
#include <thread>
#include <condition_variable>
#include <Windows.h>
#include <time.h>
#include <chrono>
using namespace std;
mutex g_mtx;
mutex ExitMtx;
timed_mutex timemtx;
int data[2000] = { 0 };
int pos = 0;
int max = 0;
condition_variable cv;
HANDLE g_mtxHandle = nullptr;
bool ExitFlag = false;
// display
void display()
{
  int cnt = 0;
  while (cnt++ < 200)
  {
    if (timemtx.try_lock_for(chrono::milliseconds(2000)))
    {
      cout << "display: " << data[cnt] << endl;
      Sleep(500);
      timemtx.unlock();
    }
    else
    {
      cout << "display time out ......." << endl;
    }
  } 
}
// consumer
void Consumer(){
  int cnt = 0;
  int postion = 0;
  while (cnt++ < 20)
  {
    Sleep(2000);
    if (timemtx.try_lock_for(chrono::milliseconds(2000)))
    {
      for (int i = 0; i < 10; ++i)
      {
        data[postion++] = max++;
        cout << "Consumer max:  " << max << endl;
      }
      timemtx.unlock();
    }
    else
    {
      cout << "Consumer time out ......." << endl;
    }
    if (cnt == 10)
    {
      ExitFlag = true;
      cv.notify_one();
      return;
    }
  }
}
int _tmain(int argc, _TCHAR* argv[])
{
  thread t1 = thread(Consumer);
  thread t2 = thread(display);
  std::unique_lock<std::mutex> lk(ExitMtx);
  //cv.wait(lk, []{return ExitFlag; });
  if (cv.wait_for(lk, chrono::seconds(1)) == std::cv_status::no_timeout)
  {
            cout << "waited ExitFlag....." << endl;
 }
else{ 
cout << "waited ExitFlag time out....." << endl;
}
t1.join();
t2.join();
return 0;
}
相关文章
|
2月前
|
安全 Java 编译器
线程安全问题和锁
本文详细介绍了线程的状态及其转换,包括新建、就绪、等待、超时等待、阻塞和终止状态,并通过示例说明了各状态的特点。接着,文章深入探讨了线程安全问题,分析了多线程环境下变量修改引发的数据异常,并通过使用 `synchronized` 关键字和 `volatile` 解决内存可见性问题。最后,文章讲解了锁的概念,包括同步代码块、同步方法以及 `Lock` 接口,并讨论了死锁现象及其产生的原因与解决方案。
81 10
线程安全问题和锁
|
2月前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
44 2
|
2月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
1月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
33 1
|
1月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
32 0
|
1月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
26 0
|
3月前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
1月前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
31 0
|
1月前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
43 0
|
1月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解