【发布时间】:2014-03-10 23:53:54
【问题描述】:
FCGI 中有一些函数叫做“getRequestContent()”。它只是获取网络浏览器发布的数据。因此,我们的 c++ 应用程序类似于为 Web 客户端提供服务的守护进程。我认为我在非“线程安全”功能方面存在某种问题:
/**
* Note this is not thread safe due to the static allocation of the
* content_buffer.
*/
std::string getRequestContent(const FCGX_Request &request)
{
char *content_length_str = FCGX_GetParam("CONTENT_LENGTH", request.envp);
unsigned long content_length = STDIN_MAX;
if (content_length_str)
{
content_length = strtol(content_length_str, &content_length_str, 10);
if (*content_length_str)
{
std::cerr << "Can't Parse 'CONTENT_LENGTH='"
<< FCGX_GetParam("CONTENT_LENGTH", request.envp)
<< "'. Consuming stdin up to " << STDIN_MAX << "\n";
}
if (content_length > STDIN_MAX)
{
content_length = STDIN_MAX;
}
}
else
{
content_length =
0; // Do not read from stdin if CONTENT_LENGTH is missing
}
char *content_buffer = new char[content_length];
std::cin.read(content_buffer, content_length);
content_length = std::cin.gcount();
do
std::cin.ignore(1024);
while (std::cin.gcount() == 1024);
std::string content(content_buffer, content_length);
delete[] content_buffer;
return content;
}
请解释一下为什么它不是线程安全代码?我们这里有什么样的问题?如何获得线程安全? :)
【问题讨论】:
标签: c++ multithreading fastcgi