草庐IT

c++ - 阻塞许多锁/ future /等。直到任何准备就绪

是否可以阻止一组锁/future/任何可阻止的实体,直到其中任何一个准备好?这个想法是我们可以做到:std::vector>futures=...;autoready_future=wait_until_an_element_is_ready(futures);process(ready_future.get());我记得像libevent、libev和libuv这样的库对于IO任务具有这种能力。但我不知道这些是否可以用于锁/future。我想到的实现这一点的一种方法是让future在完成时调用一个处理程序,但同时将处理程序比较并交换为null,这样其他future就不能调用它。但是这

c++ - Boost Thread 的 boost::unique_lock 是作用域锁吗?

我了解由boost::mutex::scoped_lock锁定的变量在超出范围时会自动解锁。boost::unique_lock怎么样,变量超出范围时会自动解锁吗?任何人也可以指出该功能的引用。doublex;boost::mutexx_mutex;voidfoo(){{boost::unique_locklock(x_mutex);x=rand();}......somecalculationwhichtakes10second............isxstilllockedhere???......}谢谢。 最佳答案 sco

c++ - 锁、互斥和临界区之间的区别

关于Mutex和Critical部分之间的区别存在一个问题,但它也不处理Locks。所以我想知道临界区是否可以用于进程之间的线程同步。还有信号状态和非信号状态的含义 最佳答案 在Windows中,关键部分(大部分)是在用户模式下实现的,互斥体会将上下文切换到内核模式(这很慢)。如果线程在拥有互斥锁时终止,则称该互斥锁被放弃。互斥体的状态设置为已发出信号,并且下一个等待线程获得所有权。在具有关键部分的相同情况下,所有其他线程将保持阻塞状态。无法命名关键部分,因此您不能使用它们来同步多个进程。

c++ - 范围互斥锁的自定义 RAII C++ 实现

我不能使用boost或最新的std::thread库。要走的路是创建一个范围互斥体的自定义实现。一句话,当一个类实例被创建一个互斥锁。在类销毁时,互斥锁被解锁。任何可用的实现?我不想重新发明轮子。我需要使用pthreads。资源获取是初始化==“RAII” 最佳答案 NoteThisisanoldanswer.C++11containsbetterhelpersthataremoreplatformindependent:std::lock_guardstd::mutex,std::timed_mutex,std::recursiv

c++ - 为什么互斥锁和条件变量可以轻松复制?

LWG2424讨论原子、互斥体和条件变量的不良状态为triviallycopyable在C++14中。我很感激修复是alreadylinedup,但是std::mutex,std::conditionvariable等。似乎有非平凡的析构函数。例如:30.4.1.2.1Classmutex[thread.mutex.class]namespacestd{classmutex{public:constexprmutex()noexcept;~mutex();//user-provided=>non-trivial…}}这难道不应该取消它们的可复制性吗? 最佳答

c++ - 同步锁的替代方案

我目前正在开发自己的小线程库,主要是为了学习,在消息队列的部分会涉及到很多地方的同步。以前我主要使用了锁、互斥锁和条件变量,它们都是同一主题的变体,一次只能由一个线程使用的部分的锁。与使用锁相比,同步有什么不同的解决方案吗?我读过一些地方的无锁同步,但有些人认为将锁隐藏在容器中是无锁的,我不同意。你只是没有明确地自己使用锁。 最佳答案 无锁算法通常涉及使用比较和交换(CAS)或类似的CPU指令,这些指令不仅以原子方式更新内存中的某些值,而且有条件地并带有成功指标。这样你就可以编写如下代码:1do2{3current_value=th

无锁结构的 C++ 原子操作

我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b我目前正在汇编中编写它,然后将其链接。但是,我想知道是否有一种方法可以让编译器自动为我执行此操作?例如用“原子”包围代码块,让它弄清楚如何在底层处理器架构中将代码实现为原子指令(或者如果底层架构不支持,则在编译时生成错误)?附:我知道gcc有一些内置函数(至少对于CAS)http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins 最佳答案 已经回答了here.C

c++ - 为什么条件变量需要锁(因此也需要互斥锁)

这个问题在这里已经有了答案:Whydopthreads’conditionvariablefunctionsrequireamutex?(10个回答)关闭7年前。条件变量是c++11的一个方面,我还在苦苦挣扎。从我收集的内容来看,条件变量与信号量非常相似。但话又说回来,信号量不需要锁来运行。条件变量可以。而锁又需要一个互斥锁。因此,为了使用信号量相当简单的功能,我们现在不仅需要管理条件变量。但也是互斥体和锁。那么为什么条件变量需要这个?加上这个要求又提供了哪些附加功能? 最佳答案 条件变量通常用于表示状态变化。通常需要一个互斥体来进

c++ - 为什么 Boost scoped_lock 不解锁互斥锁?

我一直在以这种方式使用boost::mutex::scoped_lock:voidClassName::FunctionName(){{boost::mutex::scoped_lockscopedLock(mutex_);//dostuffwaitBoolean=true;}while(waitBoolean==true){sleep(1);}//getonwiththethread'sactivities}基本上它设置waitBoolean,而另一个线程通过将waitBoolean设置为false来表示它已完成;然而,这似乎不起作用,因为其他线程无法锁定mutex_!!我假设通过将

c++ - 在容器条目上放置互斥锁的安全有效的方法

C++的std::mutex没有移动构造函数。有一个goodreasonforthat.基本上,移动构造函数本身通常不是线程安全的,互斥锁的全部意义在于多个线程将尝试同时访问它。不幸的是,不能将互斥锁直接放入容器中。容器需要能够安全地移动其内容,而使用互斥体则无法做到这一点。简单的方法是用一个单独的互斥锁来保护整个容器。但是假设我想要比这更细粒度的控制?如果我通过容器实现数据库(例如:std::map),希望能够锁定单个记录,而不仅仅是整个数据库似乎是合理的。接下来想到的是使用std::unique_ptr解决问题。那会编译,但它并没有真正改rebase本问题,不是吗?移动存在问题的场