当前位置:   article > 正文

面试二十六、c++语言级别的多线程编程

面试二十六、c++语言级别的多线程编程

一、 多线程编程

   ​​​​​

 

 这里的c++语言级别的多线程和linux的有一定的区别,c++语言级别提供的多线程比较严格,如果主线程结束了,但是子线程没有结束,进程就会异常终止,而linux不会,会继续执行。

二、模拟卖票

2.1 使用mutex互斥量

2.2 使用lock_guard(栈上对象出作用域析构),但是不支持拷贝构造和赋值重载,在函数调用和参数传递过程中就不能使用。和智能指针的socped_ptr类似

3.unique_lock 和 unique_ptr相似

unique_lock允许右值引用的拷贝构造和赋值,

三、线程间同步通信机制

    

  

  1. #include <iostream>
  2. #include <thread>
  3. #include <shared_mutex>
  4. #include <vector>
  5. #include <chrono>
  6. class ReadWriteLock {
  7. public:
  8. void read() {
  9. std::shared_lock<std::shared_mutex> lock(mutex_);
  10. std::cout << "Thread " << std::this_thread::get_id() << " is reading." << std::endl;
  11. std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟读取操作
  12. std::cout << "Thread " << std::this_thread::get_id() << " has finished reading." << std::endl;
  13. }
  14. void write() {
  15. std::unique_lock<std::shared_mutex> lock(mutex_);
  16. std::cout << "Thread " << std::this_thread::get_id() << " is writing." << std::endl;
  17. std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟写入操作
  18. std::cout << "Thread " << std::this_thread::get_id() << " has finished writing." << std::endl;
  19. }
  20. private:
  21. std::shared_mutex mutex_;
  22. };
  23. void reader(ReadWriteLock& rw_lock) {
  24. for (int i = 0; i < 5; ++i) {
  25. rw_lock.read();
  26. }
  27. }
  28. void writer(ReadWriteLock& rw_lock) {
  29. for (int i = 0; i < 5; ++i) {
  30. rw_lock.write();
  31. }
  32. }
  33. int main() {
  34. ReadWriteLock rw_lock;
  35. std::vector<std::thread> threads;
  36. // 启动多个读线程
  37. for (int i = 0; i < 3; ++i) {
  38. threads.emplace_back(reader, std::ref(rw_lock));
  39. }
  40. // 启动多个写线程
  41. for (int i = 0; i < 2; ++i) {
  42. threads.emplace_back(writer, std::ref(rw_lock));
  43. }
  44. // 等待所有线程完成
  45. for (auto& t : threads) {
  46. t.join();
  47. }
  48. return 0;
  49. }

 

 

自旋锁(spinlock)是一种用于多线程同步的锁机制,通过忙等待(不断地检查锁的状态)来实现,而不是将线程挂起或阻塞。自旋锁的主要特点是,当一个线程试图获取锁但锁已经被其他线程持有时,它会在一个循环中反复检查锁的状态,直到锁被释放。由于自旋锁在等待时不进行上下文切换,因此它适用于锁定时间很短的场景。 

 

 

 

 四、lock_guard 和 unique_lock

 五、CAS

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/657511
推荐阅读
相关标签
  

闽ICP备14008679号