Tôi có một chức năng trong đó tuyên bố foo
phải được thực hiện theo lock_guard
nhưng chỉ khi một con trỏ đến một đối tượng mutex
đã được cung cấp cho hàm làm tham số. Nếu không, foo
không phải là được bảo vệ bởi lock_guard
.Sử dụng có điều kiện của tiêu chuẩn :: lock_guard
tôi không có thể sử dụng các lock_guard
trong một if
vì khóa sẽ được phát hành ngay lập tức khi if
khối kết thúc.
như vậy, mã này là vô nghĩa:
bar(std::mutex * optionalMutex = nullptr)
{
...
if (nullptr != optionalMutex) {
std::lock_guard<std::mutex> lockScope(*optionalMutex);
} <- Here the lock ends
foo... <- foo is not protected when optionalMutex was provided
}
tôi đã cố gắng một cái gì đó như thế này:
bar(std::mutex * optionalMutex = nullptr)
{
...
nullptr == optionalMutex ? 0 : std::lock_guard<std::mutex> lockScope(*optionalMutex);
// this scope should be protected by lock_guard when optionalMutex was provided
foo...
}
Nhiều hơn hoặc ít hơn, một trong những giải pháp duy nhất có thể đối với tôi là để lặp lại foo
:
bar(std::mutex * optionalMutex = nullptr)
{
...
if (nullptr != optionalMutex) {
std::lock_guard<std::mutex> lockScope(*optionalMutex);
foo...
} else {
foo...
}
}
Trình biên dịch gcc 4.9.3
không biên dịch ví dụ thứ 2 và tuân thủ ains: error: expected primary-expression before 'lockScope'
. Cập nhật: Superlokkus giải thích trong câu trả lời của mình tại sao.
Nhưng tôi muốn tránh bất kỳ mã trùng lặp nào và do đó cũng trùng lặp foo
.
Câu hỏi của tôi:
Có một nhã cách làm thế nào để thực hiện vấn đề này và không sử dụng trùng lặp foo
. Tôi biết, tôi có thể sử dụng hàm lambda cho nhómfoo
nhưng tôi tò mò nếu có giải pháp khác.
Điều này có vẻ hơi đáng sợ tbh :) – Galik
Bạn đang cố gắng sử dụng chức năng foo với các mutexes khác nhau hoặc chỉ trong một chủ đề an toàn hoặc một cách không an toàn? –
Tôi đoán mọi người lo ngại rằng đây là một Câu hỏi XY (http://meta.stackexchange.com/a/66378): Không thanh gì đó mà các cuộc đua dữ liệu có thể xảy ra? Tại sao là mutex tùy chọn? Bởi vì nó có thể đã được tổ chức? Hay bạn có người đọc/nhà văn? – Superlokkus