gpt4 book ai didi

c++ - 只有一种方法的类,让它处理自己的互斥量是否安全?

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:06 24 4
gpt4 key购买 nike

我有一个非常简单的共享数据结构,只有一个类,想法是每个线程在进行更新之前首先获取互斥量:

class SharedData {
private:
int * score;
int n_loc;

public:
mutex mutex;
SharedData(int n_loc) : n_loc(n_loc) {
score = new int[n_loc];
}
~SharedData() {
delete [] score;
}
void update_score(int * score2) {
for(uint i = 0; i < n_loc; ++i) {
score[i] = score2[i] = max(score[i], score2[i]);
}
}
};

例如,让类处理它自己的互斥锁是否可以?

void update_score_safe(int * score2, bool force_update = false) {
if(force_update) mutex.lock();
else if(!mutex.try_lock()) return;

update_score(score2);

mutex.unlock();
}

这段代码现在是线程安全的吗?它会阻止任何代码在没有锁定的情况下调用类吗(假设我将互斥锁和真正的更新方法设为私有(private))?

最佳答案

不完全;您需要确保它不可复制或分配。您的“互斥锁”可能禁止这样做(std::mutex 确实禁止复制,这是明智的)。

如果它是可复制和/或可分配的,则定义语义;即不会锁定或将锁定复制/分配操作的源——锁定它是最不令人惊讶的。当然,按原样复制是不安全的(double delete[])但是...

另外,我没有发现对象抽象同步有什么问题——在某些(并非所有)情况下它是有意义的。

关于c++ - 只有一种方法的类,让它处理自己的互斥量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16852648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com