【发布时间】:2018-07-13 21:57:51
【问题描述】:
通常对于多线程访问的内存,我们会使用互斥锁来锁定它。 但似乎没有互斥锁,下面的逻辑是可以的,但不确定下面没有互斥锁的伪代码是否会发生竞争条件或潜在问题。
queue q;
int thread_read(){
if(!q.empty())
a = q.front();
q.pop();
}
int thread_write(b){
if(!q.full())
p.push(b)
}
【问题讨论】:
-
问多线程问题时,贴出真实代码。
-
std::queue适配器上没有“完整”方法,所以您使用的是其他方法吗?对象访问者的交错使得单独的锁定成为第二优先事项。仅供参考,std::queue是一个适配器,并包含一个模板参数化的序列容器(默认为std::deque)。与标准库中的所有其他容器一样,它也不保证对于 volatile 并发的线程安全。 -
您也不希望库容器是线程安全的。为所有用户获得正确的同步粒度是不可能的,因此您不妨将其排除在外,让用户根据他们的需要在包装器中进行同步。 Java 在几年前就遇到了他们的库
Vector。 -
本来想自己实现full()函数,后来发现full()和empty()需要counter来判断是空还是满,而这个counter也需要受互斥体保护。所以在没有 mutext 的情况下使用 full() 并不是一个好方法。
标签: c++ multithreading queue mutex shared-memory