1
7
你要么需要 Boost Interprocess semaphore 或 Boost Thread synchronization 基元。 Mutex/Lock 和 condition 是通常用于在单个进程的多个线程之间同步对共享资源的访问的原语。有 exclusive , readers-writer 和 recursive/reentrant 互斥体的类型。换句话说,互斥锁是一个独占锁。条件用于在需要解锁互斥体并等待对象更改时实现原子性。当您开始等待某个条件时,它会解锁互斥体并保证unlock+call to wait是原子的,并且没有其他线程可以修改这两个操作之间的资源。 在另一种情况下,信号量是条件和互斥的混合体,用于完全相同的目的,但用于同步进程间的访问。 也有这样的事情 non-blocking/lock-free synchronization 这几天很流行。我个人在高频交易应用程序中使用它,当数据量相对较大且低延迟非常重要时。 在你的例子中,我假设5个哲学家可以在一个进程中用5个线程来吃晚餐。在这种情况下,您必须使用互斥量,而不是信号量。不过,您可能使用条件,也可能不使用条件。这取决于你到底想实现什么,以及你到底想实现什么样的用餐过程。 我不知道如何更好地描述它,因为我最终会写一本关于它的书。所以我建议你找一本已经写好的书来理解基本概念。一旦了解了基础知识,就可以使用API/库/框架,比如 POSIX threads , Boost Interprocess 或 Thread , ACE 甚至 non-blocking algorithms 实现你想要的。 祝你好运! |
2
21
这是使用boost.thread实现非常简单的信号量的一种方法。它是一个线程间信号量,而不是进程间信号量。没有暗示的保证,等等。——我甚至还没有编译代码。它说明了互斥和条件变量是如何交互的,并假设了Boost的最新版本。 注意互斥体和条件变量是如何“配对”的——线程必须拥有互斥体的锁才能等待条件变量,并在唤醒时重新获取锁。此外,更改数据的代码需要显式唤醒可能正在等待的其他代码。这意味着互斥量、条件变量、数据和导致唤醒的条件都是紧密耦合的。紧密耦合还意味着如果可能,数据、互斥和条件变量应该被封装——任何外部修改都可能以奇怪的方式破坏代码,包括死锁、错过的唤醒和其他奇怪的错误。 所有这些都是对vlad lazarenko答案的补充——理解理论和原理至少和在多线程编程中使用“工作”代码一样重要。
|
3
0
我做了一个与boots兼容的信号量类
它经过了某种考验,但很可能我做错了什么。如果有人能证明它是正确的,那就太好了。
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
rhymes · 如何让线程操作相同的java列表 2 年前 |