以下 std::queue 代码示例线程安全吗?
Is the following std::queue code example thread safe?
我有以下代码示例,我不确定它是否是线程安全的。
void remove(/*...*/) {
int a;
float* data;
while (true)
{
unique_lock<mutex> lock1(mu);
cond.wait(lock1, [this](){return count > 0;});
lock1.unlock();
a = std_queue1.front();
data = std_queue2.front();
// process data
unique_lock<mutex> lock2(mu);
std_queue1.pop();
std_queue2.pop();
count--;
lock2.unlock();
cond.notify_all();
}
}
void add(/*...*/){
int a, iterations = 0;
vector<float*> data;
// Allocate some data entries
while (true) {
// set a
unique_lock<mutex> lock1(mu);
std_queue1.push(a);
cond.wait(lock1, [this, &limit]() { return count < limit; });
lock1.unlock();
// Init data
if (iterations++ > 2) {
unique_lock<mutex> lock2(mu);
std_queue2.push(data[/*...*/]);
count++;
lock2.unlock();
cond.notify_all();
}
}
}
remove(...) 和 add(...) 是同一个 class 的函数。每个函数由一个线程执行,两个线程访问相同的队列。互斥量被锁定以推送和弹出队列的数据,但不适用于 front() 函数。
所以我的问题是:这个例子线程安全吗?或者我是否需要 front() 函数的互斥体?函数 pop() 和 push() 是否需要互斥量?
So my question is: Is this example thread safe?
没有
Or do I need a mutex for the front() function?
是的。
And is the mutex necessary for the functions pop() and push()?
是的。
不能保证修改标准容器是线程安全的。
我有以下代码示例,我不确定它是否是线程安全的。
void remove(/*...*/) {
int a;
float* data;
while (true)
{
unique_lock<mutex> lock1(mu);
cond.wait(lock1, [this](){return count > 0;});
lock1.unlock();
a = std_queue1.front();
data = std_queue2.front();
// process data
unique_lock<mutex> lock2(mu);
std_queue1.pop();
std_queue2.pop();
count--;
lock2.unlock();
cond.notify_all();
}
}
void add(/*...*/){
int a, iterations = 0;
vector<float*> data;
// Allocate some data entries
while (true) {
// set a
unique_lock<mutex> lock1(mu);
std_queue1.push(a);
cond.wait(lock1, [this, &limit]() { return count < limit; });
lock1.unlock();
// Init data
if (iterations++ > 2) {
unique_lock<mutex> lock2(mu);
std_queue2.push(data[/*...*/]);
count++;
lock2.unlock();
cond.notify_all();
}
}
}
remove(...) 和 add(...) 是同一个 class 的函数。每个函数由一个线程执行,两个线程访问相同的队列。互斥量被锁定以推送和弹出队列的数据,但不适用于 front() 函数。
所以我的问题是:这个例子线程安全吗?或者我是否需要 front() 函数的互斥体?函数 pop() 和 push() 是否需要互斥量?
So my question is: Is this example thread safe?
没有
Or do I need a mutex for the front() function?
是的。
And is the mutex necessary for the functions pop() and push()?
是的。
不能保证修改标准容器是线程安全的。