gpt4 book ai didi

c++ - 为什么它不是线程安全的以及如何获得线程安全的?

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:47 26 4
gpt4 key购买 nike

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;
}

请解释一下为什么它不是线程安全代码?我们这里有什么样的问题?如何获得线程安全? :)

最佳答案

正如评论所说,主要问题是有一个静态分配的缓冲区。如果两个线程在该缓冲区上同步工作,您很可能会遇到竞争条件,因此您必须避免这种情况。

这意味着要么修复 FCGX_GetParam(我怀疑这是个好主意,因为它是第三方库),要么同步对它的访问:

//some common mutex
std::mutex mtx;

std::string getRequestContent(const FCGX_Request &request)
{
std::string content_length_str;
{
lock(mtx); //guard every action on the static buffer with this lock
char *content_length_cptr = FCGX_GetParam("CONTENT_LENGTH", request.envp);
content_length_str = content_length_cptr; //copy the content of the buffer
} //unlock the mutex, you dont work on the buffer hence forth

unsigned long content_length = 0;
if (!content_length_str.empty()) try {
content_length = boost::lexical_cast<unsigned long>(content_length_str);
if (content_length > STDIN_MAX)
{
content_length = STDIN_MAX;
}
}
catch(boost::bad_lexical_cast const&)
{
std::cerr << "Can't Parse 'CONTENT_LENGTH='"
<< content_length_str
<< "'. Consuming stdin up to " << STDIN_MAX << "\n";
content_length = STDIN_MAX;
}

// the rest as it was...
}

关于c++ - 为什么它不是线程安全的以及如何获得线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731613/

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