基本上,标题是不言自明的。 我按照以下方式使用它:
TypeNameHandling
到std::mutex
和lock
unlock
编辑选项,因为C ++标准容器不是线程安全的。答案 0 :(得分:10)
使用protected void processAdmission(String confirmationCode, String terminalCode)
throws AdmissionException {
//Check availability in the database
boolean isAvailable = checkDatabaseAvailability(confirmationCode, terminalCode);
if (!isAvailable)
{
throw new AdmissionException();
}
saveInDatabase(confirmationCode, terminalCode);
}
会在超出范围时再次自动解锁互斥锁。这使得在返回时或抛出异常时忘记解锁它是不可能的。您应始终更喜欢使用lock_guard
或lock_guard
而不是unique_lock
。见http://kayari.org/cxx/antipatterns.html#locking-mutex
答案 1 :(得分:1)
std::lock_guard
仅用于两个目的:
.unlock()
)。对于最后一个用例,您需要std::adopt_lock
标志:
std::lock(mutex_one, mutex_two);
std::lock_guard<std::mutex> lockPurposeOne(mutex_one, std::adopt_lock);
std::lock_guard<std::mutex> lockPurposeTwo(mutex_two, std::adopt_lock);
另一方面,每次需要锁定互斥锁时,都需要为防护分配另一个类实例,因为std::lock_guard
没有成员函数。如果您需要具有解锁功能的警卫,请查看std::unique_lock
课程。您也可以考虑使用std::shared_lock
并行读取矢量。
您可能会注意到,std::shared_lock
类在头文件中被注释,并且只能通过C ++ 17访问。根据头文件,您可以使用std::shared_timed_mutex
,但是当您尝试构建应用程序时,它将失败,因为Apple更新了头文件,而不是libc ++本身。
因此,对于Objective-C应用程序,使用GCD可能更方便,同时为所有C ++容器分配几个队列,并在需要的地方放置信号量。看看这个出色的comparison。