async_read_someを使用して_dataというchar []に保存されているポートからデータを読み込みます。そのバッファサイズは、すべての要求のために十分な大きさである:std :: stringが(boost。)内のストレージとして使用すると乱れるasync_read_some
void start() {
socket_.async_read_some(boost::asio::buffer(data_,BUFFERSIZE),make_custom_alloc_handler(allocator_,boost::bind(&attentionSession::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)));
}
void handle_read(const boost::system::error_code& error, size_t bytes_transferred) {
string ip = socket_.remote_endpoint().address().to_string();
log->processData(data_,ip,"memory");
strcpy(data_,"");
}
PROCESSDATA *別新しくalloced文字にそれをコピーすることによって、要求に(タイムスタンプなどのような)いくつかの追加情報が追加されます。そして、この文字は[]のstdにその、char *を追加するwriteToMemory(のchar *)に送信されます::文字列memoryBuffer:
void writeCacheToFile() {
// This function writes buffer data to the log file
char* temp = new char[memoryBuffer.length() + 1];
strcpy(temp, memoryBuffer.c_str());
writeToFile(temp);
delete[] temp;
memoryBuffer.clear();
}
void writeToMemory(char* data) {
int maxSize = 1024;
// Checks if char* data would 'fit' into the pre-defined maxSize
if ((strlen((const char*)data) + memoryBuffer.length()) >= maxSize) {
writeCacheToFile(); // If not the cache memoryBuffer is saved first
}
memoryBuffer.append((const char*) data);
cout << memoryBuffer.length() << endl;
}
それは動作しますが、リクエスト(要求とそれを砲撃)が常に存在する場合、物事がおかしくアップ。あなたはwriteToMemory()関数の中で上記の見ることができるように私はmemoryBufferの現在の長さをプリントアウトするために行を追加しただろうと私はそれがのstd ::文字列のスレッド安全性に関係する代持っていると思う場所です:
96
188
284
3639
94
190
286
2591
102
198
294
388
484
2591
96
2591
96
190
286
2591
を
(processData()によって処理される)要求の長さは96文字です。しかし、ここではmemoryBufferの長さがちょうど上がったり下がったりします。いくつかの長さはmaxSize(1024文字)よりも大きくなります。
編集:サムはさらにコードを追加する必要があります。
boost::asio::io_service ioService;
boost::scoped_ptr<boost::thread> ioServiceThread;
server_class server (ioService,PORT); // Create server instance
ioServiceThread.reset (new boost::thread (boost::bind (&boost::asio::io_service::run, &ioService )));
// Only one threaded io_service (to receive user inputs in main() function)
そして、これが要求を完了した後async_acceptorの機能である:これは私がio_serviceを起動する方法です
typedef boost::shared_ptr<session_class> session_ptr;
void handleAccept(session_ptr thisSession, const boost::system::error_code& error) {
if (!error) {
thisSession->start(); // Calls the start() function above
thisSession.reset(new session(ioService,LOGGING_CLASS));
acceptor.async_accept(thisSession->socket(),boost::bind(&server_class::handleAccept, this, thisSession, PLACEHOLDER_ERROR));
}
}
session_classは、関数が(スタート保持)とhandle_read(x、y)は、上述しました。 LOGGING_CLASSは、ログファイルを書き込むクラスを提供します(関数writeCacheToFile()とwriteToMemory(char *)を保持します)。ログ(上記)はこのクラスの一種です。
EOE:EDIT OF END
私はブースト::スレッドでそれが完全に混ざっmemoryBuffer
で終わる(STDする::文字列を受け取った、char *を付加する)キャッシュ一部を外部委託修正しようとした場合本当にstd :: stringsや他の何かのスレッドセーフティですか?
ご協力いただきありがとうございます。 :)
ポール
std :: stringはスレッドセーフであると思いますか? –
このトピックはStackOverflow [リンク](http://stackoverflow.com/questions/1594803/is-stdstring-thead-safe-with-gcc-4-3)にもありますが、g ++ 4.2の有無はわかりません。 1はスレッドセーフなstd :: stringsをサポートしています。 – Paul
現在の標準ではスレッドは言及されていないので、std :: stringはスレッドセーフではありません。あなたは何とか複数のスレッドを使って何をしようとしていますか? –