我没有多线程经验,但是我需要在套接字编程中使用它。我的问题是,我需要遍历类的静态向量,但是,当我这样做时,其他线程会从该向量中删除元素,这会使我的程序崩溃。我假设我需要某种方式锁定向量,但我不知道如何锁定。我发现的唯一解决方案似乎是Windows特定的(Concurrency :: concurrent_vector)。这是我的代码:
#include <pthread.h>
#include <thread>
#include <mutex>
std::vector<User*> User::users;
std::mutex mtx;
int main() {
//...
mtx.lock();
for (int i = 0; i < User::users.size(); ++i) {
User::users.at(i)->stop = true;
User::users.at(i)->shutdownSocket();
}
mtx.unlock();
}
这似乎没有锁定矢量。我在Ubuntu上使用CLion。我如何安全地做到这一点?
编辑:我在访问向量的任何地方都包含mtx.lock()和unlock()。我已经仔细检查过了。
使用在main.cpp中声明的一个互斥锁和在User.h中声明的互斥锁是否重要?我必须对同一向量使用相同的互斥体吗?