我想知道在pthreads中使用条件变量而不是互斥锁的性能优势是什么.
我发现:"没有条件变量,程序员需要让线程连续轮询(可能在一个关键部分),检查是否满足条件.这可能非常耗费资源,因为线程会持续忙于此条件变量是一种在没有轮询的情况下实现相同目标的方法." (https://computing.llnl.gov/tutorials/pthreads)
但似乎互斥锁调用也是阻塞的(与自旋锁不同).因此,如果线程(T1)无法获得锁定,因为某些其他线程(T2)具有锁定,则操作系统将T1置于休眠状态,并且仅在T2释放锁定并且OS为T1提供锁定时才唤醒.线程T1没有真正轮询以获得锁定.从该描述中,似乎使用条件变量没有性能优势.在任何一种情况下,都不涉及民意调查.操作系统无论如何都提供了条件变量范例可以提供的好处.
你能解释一下究竟发生了什么吗?
variables multithreading mutex pthreads conditional-statements
我很想知道使用默认新运算符的分配内存是否是非阻塞操作.
例如
struct Node {
    int a,b;
};
...
Node foo = new Node();
如果多个线程试图创建一个新节点,并且如果其中一个线程在分配过程中被操作系统暂停,它是否会阻止其他线程进展?
我问的原因是因为我有一个创建新节点的并发数据结构.然后,我修改了算法以回收节点.这两种算法的吞吐量性能在24核机器上几乎完全相同.但是,我随后创建了一个在所有系统核心上运行的干扰程序,以便尽可能多地创建OS抢占.相对于回收节点的算法,创建新节点的算法的吞吐量性能降低了5倍.
我很想知道为什么会这样.
谢谢.
*编辑:指向我的Linux的c ++内存分配器的代码也会有所帮助.在发布这个问题之前我试过了,但是找不到它.
假设我在调用时阻塞了多个线程pthread_mutex_lock().当互斥锁变得可用时,调用的第一个线程是否pthread_mutex_lock()获得锁定?也就是说,pthread_mutex_lock()按FIFO顺序调用?如果不是,那么它们的订单是什么?谢谢!
是否有可能在C中只获得一个int,然后在不读取整个int并将其写回内存的情况下翻转它?
context:试图在pthread中避免过多的锁定/解锁.