gpt4 book ai didi

c++ - std::list 在 libev 回调中崩溃

转载 作者:行者123 更新时间:2023-11-30 04:27:01 25 4
gpt4 key购买 nike

我有一个 libev 写回调函数,它检查要发送给客户端的未决数据。挂起的数据缓冲区看起来像

struct PendingData{
unsigned short data_size;
char data[4096];
};
typedef std::list<PendingData*> PendingBuf;

class Client{
private:
int sock;
PendingBuf data_list;
public:
ev::io cl_io;
void write_cb(ev::io &watcher, int events);
};

回调函数通过以下方式检查容器中是否有数据:

void Client::write_cb(ev::io &watcher, int events){
PendingData* pd = NULL;
int ires = 0;
if(!data_list.empty()){
pd = data_list.front();
ires = send(sock, pd->data, pd->data_size, 0);
if(ires == pd->data_size){
delete pd;
data_list.pop_front();
return;
}
// .... additional checking here
}
}

程序因段错误而崩溃

if(!data_list.empty())

有时在

pd = data_list.front();

在第二种情况下,empty() 返回 false,但调试器显示该列表没有数据成员

它在单独的线程中运行(从同一个线程读取和写入缓冲区)我还尝试将其移动到主线程而不启动任何其他线程,但效果相同。

操作系统是 Ubuntu 12.04,编译器是 g++ 4.6我的项目中也启用了 c++0x

最佳答案

也许您只需要在访问 std::list 时使用锁(互斥锁)喜欢

// near list
class Client {
/// ...
PendingBuf data_list;
std::mutex list_lock;
/// ...
}

void Client::write_cb(ev::io &watcher, int events){
std::lock_guard<std::mutex> lock(list_lock);
if(!data_list.empty()){
/// ...
}

并且在写入此列表时也使用锁。此外,还可以使用读锁和写锁。写锁总是独占所有其他锁(读和写)。对于并发读取,可以在同一时刻多次获取读取锁。

关于c++ - std::list 在 libev 回调中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164424/

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