b***i 发帖数: 3043 | 1 有个程序最近死机。我看,发现使用了future。一个函数被回调,函数里
static bool initialized = false;
if (!initialized){
InitializeCriticalSection(&cs);
initialized = true;
}
...
EnterCriticalSection
...
LeaveCriticalSection
这个代码是不是有问题?现在C++11/14了,最好的方案是什么? |
L****8 发帖数: 3938 | 2 这个是ms的东西吧?
【在 b***i 的大作中提到】 : 有个程序最近死机。我看,发现使用了future。一个函数被回调,函数里 : static bool initialized = false; : if (!initialized){ : InitializeCriticalSection(&cs); : initialized = true; : } : ... : EnterCriticalSection : ... : LeaveCriticalSection
|
b***i 发帖数: 3043 | 3 对,CriticalSection里面使用一些古老的Win32API来调用外部的exe文件。
当然,我认为可以使用mutex/semaphore实现。不过我觉得我们的方案有问题,不是真
正的一次初始化。有可能多次,因为多个核心的CPU看到这个static变量都是false
而且,以前也讨论过,即使加上volatile也不行
【在 L****8 的大作中提到】 : 这个是ms的东西吧?
|
w***g 发帖数: 5958 | 4 明显的问题,
if (!initialized) {
...
initialized = true;
}
应该改成
if (!test_and_set(initialized)) {
...
}
test_and_set 必须是atomic操作, 比如std::atomic_flag::test_and_set。
【在 b***i 的大作中提到】 : 有个程序最近死机。我看,发现使用了future。一个函数被回调,函数里 : static bool initialized = false; : if (!initialized){ : InitializeCriticalSection(&cs); : initialized = true; : } : ... : EnterCriticalSection : ... : LeaveCriticalSection
|
b***i 发帖数: 3043 | 5 我们的代码是2014年春天开始写的,估计那时候C++11还没有在VS里面完全实现。现在
用VS15,完全实现了,可以不适用古老的critical section了吧?
完全C++11如何写?就是避免一段代码被同时执行而已。mutex可以吗?
class Processing {
static std::mutex m;
bool Process(...){
...
{
std::lock_guard lk(m);
//code inside critical section
}
// code outside critical section
}
};
【在 w***g 的大作中提到】 : 明显的问题, : if (!initialized) { : ... : initialized = true; : } : 应该改成 : if (!test_and_set(initialized)) { : ... : } : test_and_set 必须是atomic操作, 比如std::atomic_flag::test_and_set。
|
T********i 发帖数: 2416 | 6 use std::recursive_mutex if you need identical behavior.
【在 b***i 的大作中提到】 : 我们的代码是2014年春天开始写的,估计那时候C++11还没有在VS里面完全实现。现在 : 用VS15,完全实现了,可以不适用古老的critical section了吧? : 完全C++11如何写?就是避免一段代码被同时执行而已。mutex可以吗? : class Processing { : static std::mutex m; : bool Process(...){ : ... : { : std::lock_guard lk(m); : //code inside critical section
|
x****u 发帖数: 44466 | 7 STL里面有包装,不过你这个用法有问题啊
【在 b***i 的大作中提到】 : 有个程序最近死机。我看,发现使用了future。一个函数被回调,函数里 : static bool initialized = false; : if (!initialized){ : InitializeCriticalSection(&cs); : initialized = true; : } : ... : EnterCriticalSection : ... : LeaveCriticalSection
|
l*********s 发帖数: 5409 | 8 std::call_once and std::once_flag, |