クライアントに送信される保留中のデータをチェックする 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();
2 番目のケースでは、empty() は false を返しますが、デバッガーは、そのリストにはデータ メンバーがありません
別のスレッドで実行されます(バッファは同じスレッドから読み書きされます)追加のスレッドをまったく開始せずにこれをメインスレッドに移動しようとしましたが、同じ効果がありました。
OS は Ubuntu 12.04、コンパイラは g++ 4.6 です。私のプロジェクトでは c++0x も有効になっています。