lock_guard和unique_lock

简介: lock_guard和unique_lock
1.lock_guard和unique_lock
2.condition_variable wait和notify_all方法
std::mutex mtx;
std::condition_variable cv;
int main()
{
  //锁+双重判断
  void sellTicket(int index)
  {
  while (ticketCount > 0) //ticketCount = 1 锁+双重判断
  {
  //当ticketCount为1时,其他线程这时可能指定到这里,但是当该线程执行完后,票变为了0,其他线程获取锁,对0减一,是错误的,所以要加双重判断。
    mtx.lock();
    if (ticketCount > 0)
    {
      tickedCount--;
    }
    mtx.unlock();
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
  }
  }
  /*
  通知在cv上等待的线程,条件成立了,起来干活了
  其他在cv上等待的线程,收到通知,从等待状态->阻塞状态->获取互斥锁->继续往下
  */
  cv.notify_all();
  //它不仅可以使用在简单的临界区代码段的互斥操作中,还能用在函数调用过程中
  unique_lock<std::mutex> lck(mtx);
  cv.wait(lck); //1.使线程进入等待状态 2.lck.unlock可以把mtx给释放掉
  //不可能用在函数参数传递或者返回过程中
  //只能用在简单的临界区代码段的互斥操作中
  lock_guard<std::mutex> guard(mtx);
  //mtx.lock();
  //...
  //mtx.unlock();
  return 0;
}
//lock_guard不能手动释放(unlock)

CAS

volatile std::atomic_bool isReady = false;
volatile std::atomic_int mycount = 0;//volatile防止多线程对共享变量进行缓存,访问的都是原始变量的值
void task()
{
  while (!isReady)
  {
    std::this_thread::yield();//线程出让当前的CPU时间片,等待下一次调度
  }
  for (int i = 0; i < 100; i++)
  {
    mycount++;
  }
}
int main()
{
  list<std::thread> tlist;
  for (int i = 0; i < 10; i++) 
  {
    tlist.push_back(std::thread(task));
  }
  std::this_thread::sleep_for(std::chrono::seconds(3));
  isReady = true;
  for (std::thread &t : tlist)
  {
    t.join():
  }
  cout << "mycount: " << mycount << endl;
  return 0;
}
相关文章
|
11月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
408 6
|
11月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
146 0
C++ 多线程之线程管理函数
|
11月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
167 2
|
存储 并行计算 Java
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(二)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
513 0
|
12月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
139 1
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
Baichuan-Omni-1.5:百川智能开源全模态理解与生成模型,支持文本、图像、音频和视频的多模态输入和输出
Baichuan-Omni-1.5 是百川智能开源的全模态理解模型,支持文本、图像、音频和视频的多模态输入和输出,显著提升多模态交互体验。
562 22
Baichuan-Omni-1.5:百川智能开源全模态理解与生成模型,支持文本、图像、音频和视频的多模态输入和输出
|
安全 算法 程序员
【C++入门到精通】Lock_guard与Unique_lock C++11 [ C++入门 ]
【C++入门到精通】Lock_guard与Unique_lock C++11 [ C++入门 ]
222 0
|
C++
[C++] 互斥锁(unique_lock、lock_guard)
[C++] 互斥锁(unique_lock、lock_guard)
189 0
|
算法 Linux 调度
C++ std::condition_variable 条件变量类探索:解锁条件变量的底层原理
C++ std::condition_variable 条件变量类探索:解锁条件变量的底层原理
896 0