由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ InitializeCriticalSection问题
相关主题
about critical sectionpthread_create inside a constructor
c++是不是准备加一个glue layer把系统给隔离出来?请问static variable init的问题?
static initialization dependency c++static vector 怎么 initialize ?
谁能推荐一个read-writer lock的C++实现? (转载)关于C/C++里的Static variable的memory allocation/initializa
弱问C编程一个关于static问题C++: Static initialization dependency
how to statically initialze a mutex in class?C++类的静态函数对成员函数
c++ 不自动initialize变量么?用STL map的时候怎么自己定义大小比较的关系
double-checked locking请教C++ STL中priority_queue模板参数中的Compare函数
相关话题的讨论汇总
话题: c++话题: std话题: 问题
进入Programming版参与讨论
1 (共1页)
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,
1 (共1页)
进入Programming版参与讨论
相关主题
请教C++ STL中priority_queue模板参数中的Compare函数弱问C编程一个关于static问题
C++ vector 到底能多大how to statically initialze a mutex in class?
请教如何自己C++编程牛逼些c++ 不自动initialize变量么?
scoped lock的问题double-checked locking
about critical sectionpthread_create inside a constructor
c++是不是准备加一个glue layer把系统给隔离出来?请问static variable init的问题?
static initialization dependency c++static vector 怎么 initialize ?
谁能推荐一个read-writer lock的C++实现? (转载)关于C/C++里的Static variable的memory allocation/initializa
相关话题的讨论汇总
话题: c++话题: std话题: 问题