从C ++ 11中的另一个线程解锁一个线程

亚尼克

我对C ++ 11的thread.h api并不了解很多(事实上,我也不熟悉线程编程,但是最近我读了很多,并了解了并发性和类似的知识),但我开始使用它,但现在遇到的问题是我从未真正遇到过。

我有两个线程函数,说这些

std::thread(thread1, args); // Spawn thread 1
std::thread(thread2, args); // Spawn thread 2

[...]

int thread1(bunch of args)
{
     lock_thread_2();
     [do stuff]
     while (some condition) {
         [do stuff]
         unlock_thread_2();
     }
}

int thread2(bunch of args)
{
     while (some condition) {
         [do stuff]
         wait_for_thread1_to_unlock_me();
     }
}

我最初考虑过使用std :: mutex进行操作,但是我读到它可能很危险,因为如果我解锁一个已经解锁的互斥锁,则行为是不确定的,而且在此之上它还是无法正常工作,就像Mutex.lock()不能不一定要暂停执行(只有在互斥锁已经锁定的情况下才执行),所以编写它非常可怕,我不得不将unlock()和lock()调用耦合在一起。

这里要注意的重要一点是,线程2的执行仅由线程1控制,但线程2绝不会以任何方式锁定线程1。只有线程2被线程1锁定,只有线程1控制线程2的执行流程,否则就没有控制权。

您将如何以一种干净,受支持的方式做到这一点?您愿意举一个示例代码吗?

谢谢!

巴里

使用condition_variable

std::condition_variable cv;

int thread1(bunch of args)
{
     [do stuff]
     while (some condition) {
         [do stuff]
         cv.notify_one();
     }
}

int thread2(bunch of args)
{
     std::mutex mtx;
     std::unique_lock<std::mutex> lk(mtx);

     while (some condition) {
         [do stuff]
         cv.wait(lk);
     }
}

wait()返回时,要么cv将被notify()-ed ...或者将是一个虚假唤醒。为了处理后者,添加谓词通常会很有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从C#中的另一个线程在主线程中设置变量?

来自分类Dev

如何从C#中的另一个线程在主线程中设置变量?

来自分类Dev

通知线程停止-在另一个线程和类中引发事件-C#

来自分类Dev

C#/ WPF从另一个类中创建的另一个线程更新UI

来自分类Dev

c#设置/从另一个线程/从另一个线程获取控件的属性

来自分类Dev

从另一个线程插入/擦除时,能否访问C ++ 11 std :: map条目?

来自分类Dev

C ++线程:如何使用lambda函数将主线程中的参数传递给另一个线程

来自分类Dev

在Objective-C中另一个线程中的计时器

来自分类Dev

C#线程在另一个类中启动

来自分类Dev

如何从C#中的另一个非UI线程更新文本标签

来自分类Dev

在Unity / C#中,.Net的async / await是否确实从另一个线程开始?

来自分类Dev

从C ++代码中的另一个线程读取的性能影响

来自分类Dev

我如何从C ++中的静态线程入口点函数调用另一个函数?

来自分类Dev

C#-如何从另一个类中的线程更新主UI

来自分类Dev

如何从一个线程向另一个线程发送消息(用C语言编写)?

来自分类Dev

C ++多线程将模板化std :: bind绑定到另一个线程

来自分类Dev

如何阻塞线程,直到另一个线程在C#中获得服务器响应

来自分类Dev

线程设计和设计,并在C ++ Win32中从另一个线程中调用一个函数

来自分类Dev

C#-使用委托从另一个线程更新GUI datagridview

来自分类Dev

C ++如何触发PostMessage在另一个线程中进行

来自分类Dev

由另一个线程修改的C#.NET 5.0 Wpf UI

来自分类Dev

C#:使用线程从另一个类更新表单属性

来自分类Dev

从另一个线程更新 UI c++ Windows Form 应用程序

来自分类Dev

每个线程一个类的实例,C ++ 11

来自分类Dev

每个线程一个类的实例,C ++ 11

来自分类Dev

如何在C#中的另一个线程上运行的循环中更新文本框

来自分类Dev

将数据传递到C ++ Winsock应用程序中的另一个线程

来自分类Dev

C Linux pthread:使用消息队列将数据从一个线程发送到另一个线程会产生意外结果

来自分类Dev

在C#中,是否可以保证任何给定线程都可以看到从另一个线程到引用类型变量的值所做的更新?

Related 相关文章

  1. 1

    如何从C#中的另一个线程在主线程中设置变量?

  2. 2

    如何从C#中的另一个线程在主线程中设置变量?

  3. 3

    通知线程停止-在另一个线程和类中引发事件-C#

  4. 4

    C#/ WPF从另一个类中创建的另一个线程更新UI

  5. 5

    c#设置/从另一个线程/从另一个线程获取控件的属性

  6. 6

    从另一个线程插入/擦除时,能否访问C ++ 11 std :: map条目?

  7. 7

    C ++线程:如何使用lambda函数将主线程中的参数传递给另一个线程

  8. 8

    在Objective-C中另一个线程中的计时器

  9. 9

    C#线程在另一个类中启动

  10. 10

    如何从C#中的另一个非UI线程更新文本标签

  11. 11

    在Unity / C#中,.Net的async / await是否确实从另一个线程开始?

  12. 12

    从C ++代码中的另一个线程读取的性能影响

  13. 13

    我如何从C ++中的静态线程入口点函数调用另一个函数?

  14. 14

    C#-如何从另一个类中的线程更新主UI

  15. 15

    如何从一个线程向另一个线程发送消息(用C语言编写)?

  16. 16

    C ++多线程将模板化std :: bind绑定到另一个线程

  17. 17

    如何阻塞线程,直到另一个线程在C#中获得服务器响应

  18. 18

    线程设计和设计,并在C ++ Win32中从另一个线程中调用一个函数

  19. 19

    C#-使用委托从另一个线程更新GUI datagridview

  20. 20

    C ++如何触发PostMessage在另一个线程中进行

  21. 21

    由另一个线程修改的C#.NET 5.0 Wpf UI

  22. 22

    C#:使用线程从另一个类更新表单属性

  23. 23

    从另一个线程更新 UI c++ Windows Form 应用程序

  24. 24

    每个线程一个类的实例,C ++ 11

  25. 25

    每个线程一个类的实例,C ++ 11

  26. 26

    如何在C#中的另一个线程上运行的循环中更新文本框

  27. 27

    将数据传递到C ++ Winsock应用程序中的另一个线程

  28. 28

    C Linux pthread:使用消息队列将数据从一个线程发送到另一个线程会产生意外结果

  29. 29

    在C#中,是否可以保证任何给定线程都可以看到从另一个线程到引用类型变量的值所做的更新?

热门标签

归档