- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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;
}
}
khác
{
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();
LÀM
std::cin.ignore(1024);
while (std::cin.gcount() == 1024);
std::string content(content_buffer, content_length);
delete[] content_buffer;
return content;
}
请解释一下为什么它不是线程安全代码?我们这里有什么样的问题?如何获得线程安全? :)
câu trả lời hay nhất
正如评论所说,主要问题是有一个静态分配的缓冲区。如果两个线程在该缓冲区上同步工作,您很可能会遇到竞争条件,因此您必须避免这种情况。
这意味着要么修复 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(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/
Tôi đang viết một kịch bản để chủ nhân của tôi lấy một số dữ liệu từ trang web của chính họ. Vì một danh sách dài các lý do tôi cần lấy dữ liệu từ trang web như trong hình. Tôi phát hiện ra rằng một số dữ liệu này đã được truy xuất thông qua lệnh gọi js... Nhìn lại, lẽ ra tôi nên chọn Cơ giới hóa
Tôi đang sử dụng python và cryptoography.io để ký và xác minh tin nhắn. Tôi có thể lấy biểu diễn byte được mã hóa DER của chữ ký thông qua: cryptoography_priv_key.sign(messag
đóng cửa. Câu hỏi này không đáp ứng các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện vấn đề này? Câu hỏi được cập nhật để làm cho câu hỏi trở thành chủ đề cho Stack Overflow. Đóng cửa 6 năm trước Cải thiện điều này
Có thể phân biệt giữa ECDF? Lấy cái thu được dưới đây làm ví dụ. set.seed(1) a <- Sort(rnorm(100)) b <- ecdf(a)plot(b) Tôi muốn đạo hàm b để có được hàm mật độ xác suất của nó (PD
Tôi đã tìm ra cách lấy mimetypes từ navigator.mimeTypes: function GetMimeTypes() { var message = "";
Tôi đang sử dụng các nút radio trong biểu mẫu để ẩn/hiển thị trường ID thành viên trong biểu mẫu liên hệ. Vấn đề là khi javascript thay đổi trường id ẩn có trong html (được đặt thành giá trị "none"), trường này không còn khả dụng qua bài đăng
Tôi đang làm thử nghiệm đơn vị. Tôi phải kiểm tra tất cả các tình huống if..else có thể xảy ra. Nhưng trong câu lệnh if này: int32_t i32Res = snprintf(buffer, len, "The%d_String_%d", 0
Tôi có một ứng dụng Facebook mà tôi muốn nhận được tổng số lượt "thích". Tôi muốn biết liệu điều này có thể thực hiện được không. trong đó ID là ID của ứng dụng và ACCESS_TOKEN là mã thông báo truy cập hiện tại của ứng dụng tôi đã thử: gra
Nếu tôi có nhiều phiên bản điện toán cố gắng giành được hợp đồng thuê trên cùng một blob cùng lúc thì có vẻ như nó thường thành công. Tôi có ấn tượng rằng một khi hợp đồng thuê được phát hành (và do đó được khách hàng mua lại) thì không thể phát hành một hợp đồng thuê khác cùng lúc? Tôi hy vọng đây là trường hợp, tôi đã sử dụng
Đây là chỉ mục của tôi POST /blogs/1 { "name" : "learn java", "popularity" : 100 } POST /blogs/2 { "name" : "l
Tôi đang sử dụng Symfony2 với FOSUserBundle. Tôi cần có được vai trò cao nhất cho người dùng. vai trò_hierarchy: ROLE_CONTRIBUTOR: ROLE_USER
Tôi đang gửi yêu cầu dựa trên REST tới máy chủ. Tôi hy vọng sớm nhận được phản hồi và muốn tìm hiểu về các cách tối ưu hóa khác nhau có thể được thực hiện. Tất nhiên, có một cách là gửi các yêu cầu này song song trong các luồng. Có những lựa chọn nào khác để tối ưu hóa tính năng này? Trên máy chủ, cấu hình nào có thể được thêm vào?
Đây có lẽ là một loại câu hỏi trùng lặp nhưng dường như tôi không thể tìm được giải pháp phù hợp. Tôi đang sử dụng git4idea.history.GitHistoryUtils.history() để lấy danh sách các cam kết. Nếu kiểm tra một trong những cái nhỏ hơn
Tôi đang làm việc trên một chương trình cho phép tôi nhập tiền lương hàng tuần và tổng số giờ làm việc trong tuần đó. Nó sẽ hiển thị câu trả lời ở mức lương theo giờ. Nhưng tôi không thể hiển thị đúng công thức "centavos/2 chữ số thập phân" và nó không muốn sử dụng float % fl
Đã kết thúc. Câu hỏi này đang tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Nó không đáp ứng các nguyên tắc của Stack Overflow. Câu trả lời không được chấp nhận vào thời điểm này. Chúng tôi không cho phép các câu hỏi tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để
Tôi đã thử mContext.getMainLooper() và Looper.getMainLooper(). Cả hai đều trả về cùng một kết quả, nhưng tôi muốn biết phương pháp nào đúng? Tôi cũng đã tải xuống mã từ Liên kết nhà phát triển Android
Tôi có bảng "đơn vị liên kết" với cột "người dùng" và "được giới thiệu". Với một người dùng, tôi muốn có được tất cả những người chơi "cấp n" do người dùng đó giới thiệu. Với n=1, chúng tôi chỉ quan tâm đến số lượng người chơi mà bạn trực tiếp giới thiệu: SELE
Tôi có hai bảng trong cơ sở dữ liệu PostgreSQL 9.5: project - id - name task - id - project_id - name -update_
Xin hãy giúp tôi làm cách nào để tôi có được kết quả như mong đợi, cảm ơn trước và xin lỗi vì tiếng Anh không tốt của tôi. PHP: $dog = implode(',', $data['dogbreed']); $query .= "VÀ `do
Tôi đã để xung = CGVectorMake(CGFloat(Constants.impulse), 0) Làm cách nào tôi có thể nhận được giá trị âm của nó mà không cần tạo CGVector khác? Tôi đang cân nhắc sử dụng C
Tôi là một lập trình viên xuất sắc, rất giỏi!