gpt4 book ai didi

由于互斥体,C++ vector 删除迭代器超出范围

转载 作者:行者123 更新时间:2023-11-30 02:48:58 30 4
gpt4 key购买 nike

所以,有一个字符串 vector 。由于它是 cl_mgr 类的静态成员,因此它充当全局变量。

std::vector<std::string> cl_mgr::to_send_queue;

但是,我从来没有在我的代码中直接访问这个 vector 。要向其中添加字符串,我调用以下函数:

void cl_mgr::sendmsg(std::string msg)
{
std::mutex mtx;

mtx.lock();
if ( connected )
{
cl_mgr::to_send_queue.push_back(msg + '\r');
}
mtx.unlock();
}

这是错误的地方:行cl_mgr::to_send_queue.erase(cl_mgr::to_send_queue.begin());有时会使迭代器超出范围。这应该只在 vector 为空时发生,但我已经在 while 条件下检查过了。

所以接下来我添加了大小数组以用 to_send_queue.size() 填充它并发现有时它返回零!通常所有数组都由 1 组成,但有时像 sizes[9500] 这样的元素是 0。

出了什么问题,如何解决?

std::mutex mtx;
mtx.lock();
while ( !cl_mgr::to_send_queue.empty() )
{
string tosend = cl_mgr::to_send_queue[0];

int sizes[10000];
sizes[0]=0;
for (int i = 1; i < 10000; ++i)
{
sizes[i] = cl_mgr::to_send_queue.size();
if ( sizes[i] < sizes[i-1] )
{
int breakpoint = 0; //should never be hit but it does !
}
}

cl_mgr::to_send_queue.erase(cl_mgr::to_send_queue.begin()); //CRASH HERE

send(hSocket, tosend.c_str(), tosend.length(), 0 );


Sleep(5);
}
mtx.unlock();

最佳答案

std::mutex 是方法的局部变量。这意味着此方法的每次调用都有它自己的互斥量并且不保护任何东西。

要解决此问题,您必须将互斥锁移动到与 vector to_send_queue 相同的范围并使用 std::lock_guard .在网站上,有一个如何使用这个的例子

int g_i = 0;
std::mutex g_i_mutex; // protects g_i

void safe_increment()
{
std::lock_guard<std::mutex> lock(g_i_mutex);
++g_i;

std::cout << std::this_thread::get_id() << ": " << g_i << '\n';

// g_i_mutex is automatically released when lock
// goes out of scope
}

关于由于互斥体,C++ vector 删除迭代器超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663544/

30 4 0