我正在调试一个多线程应用程序,并找到了内部结构CRITICAL_SECTION.我发现LockSemaphoreCRITICAL_SECTION的数据成员很有趣.
它看起来像是LockSemaphore一个自动重置事件(顾名思义不是信号量),并且当第一次线程等待Critcal Section某个其他线程锁定时,操作系统会静默创建此事件.
现在,我想知道关键部分总是更快吗?Event是一个内核对象,每个Critical部分对象都与事件对象相关联,那么Critical Section与其他内核对象(如Mutex)相比,如何更快?此外,内部事件对象如何实际影响Critical部分的性能?
这是结构CRITICAL_SECTION:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
Run Code Online (Sandbox Code Playgroud) 我正在浏览遗留代码并找到以下代码段:
MyClass::~MyClass()
{
EnterCriticalSection(&cs);
//Access Data Members, **NO Global** members are being accessed here
LeaveCriticalSection(&cs);
}
Run Code Online (Sandbox Code Playgroud)
我想知道它有没有机会保护析构函数?
考虑一个场景:
1. Thread1 - About to execute any of the member function which uses critical section
2. Thread2- About to execute destructor.
Run Code Online (Sandbox Code Playgroud)
如果执行顺序是1 => 2那么它可能会起作用.但如果订单被撤销怎么办?
这是一个设计问题吗?
const int MIN_NUMBER = 4;
class Temp
{
public:
Temp(int x) : X(x)
{
}
bool getX() const
{
try
{
if( X < MIN_NUMBER)
{
//By mistake throwing any specific exception was missed out
//Program terminated here
throw ;
}
}
catch (bool bTemp)
{
cout<<"catch(bool) exception";
}
catch(...)
{
cout<<"catch... exception";
}
return X;
}
private:
int X;
};
int main(int argc, char* argv[])
{
Temp *pTemp = NULL;
try
{
pTemp = new Temp(3);
int nX = …Run Code Online (Sandbox Code Playgroud) 关于deque中的迭代器失效,我有点困惑.(在这个问题的背景下)
以下是摘自 - The C++标准库:教程和参考,作者:Nicolai M. Josuttis
除开头或结尾之外的任何元素的插入或删除都会 使引用双端队列元素的所有指针,引用和迭代器无效.
以下是SGI网站的摘录:
deque的迭代器失效的语义如下.Insert(包括
push_front和push_back)使引用deque的所有迭代器无效.在双端队列中间擦除使所有引用双端队列的迭代器无效.只有当它指向已擦除的元素时,在双端队列的开头或结尾处擦除(包括pop_front和pop_back)才会使迭代器无效.
恕我直言,deque是块的集合,第一个块在一个方向上生长,最后一个块在相反方向上生长.
- - -
- - -
| - - ^
| - - |
V - - |
- - -
- - -
Run Code Online (Sandbox Code Playgroud)
push_back, push_front 不应该对deque迭代器产生任何影响(我同意Josuttis).
什么是正确的解释?标准对此有何看法?
我们正在将VC++项目从Visual Studio 2003移植到Visual Studio 2008 SP1(9.0.30729.4148).依赖的外部库也使用Visual Studio 2008 SP1进行编译.
MainApp - Main application Compiled with VS SP1 9.0.30729.4148
ExtStaticLib1 - External static library compiled with VS SP1 9.0.30729.4148
ExtDynamicDll1 - External DLL compiled with VS SP1 9.0.30729.4148
Run Code Online (Sandbox Code Playgroud)
主应用程序有两种部署方案:
我们正在做以下事来解决这个问题:
使用宏_BIND_TO_CURRENT_OPENMP_VERSION(对于MainApp中的所有项目)编译MainApp目标.
将VS2008SP1可再发行DLL分发为专用程序集,并将它们复制到应用程序安装目录中.
问题:
谢谢.
c++ redistributable visual-studio-2008-sp1 visual-c++-2008 visual-c++
我有这个基本的怀疑.STL标头没有.h扩展名.
#include <vector>
#include <map>
Run Code Online (Sandbox Code Playgroud)
这背后有什么具体原因吗?有人知道这背后的历史,请分享.
编辑:
@GMan找到了迈克尔伯尔的答案 来解决这个问题.
我正在阅读有关volatile成员函数的信息并且遇到了一个肯定,即成员函数可以同时是const和volatile.我没有真正使用这样的东西.任何人都可以分享他们在成员函数作为const和volatile一起实际使用的经验.
我写了小班来测试同样的东西:
class Temp
{
public:
Temp(int x) : X(x)
{
}
int getX() const volatile
{
return X;
}
int getBiggerX()
{
return X + 10;
}
private:
int X;
};
void test( const volatile Temp& aTemp)
{
int x = aTemp.getX();
}
int main(int argc, char* argv[])
{
const volatile Temp aTemp(10);
test(aTemp);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 对于特定于类的new_handler实现,我在"有效的c ++"一书中遇到了以下示例.这看起来在多线程环境中存在问题,我的问题是如何在多线程环境中实现类特定的new_handler?
void * X::operator new(size_t size)
{
new_handler globalHandler = // install X's
std::set_new_handler(currentHandler); // handler
void *memory;
try { // attempt
memory = ::operator new(size); // allocation
}
catch (std::bad_alloc&) { // restore
std::set_new_handler(globalHandler); // handler;
throw; // propagate
} // exception
std::set_new_handler(globalHandler); // restore
// handler
return memory;
}
Run Code Online (Sandbox Code Playgroud) 我有一个填充了百万条记录的oracle数据库.我正在尝试编写一个SQL查询,该查询根据特定条件从数据库返回第一个"N"个排序记录(比如100条记录).
SELECT *
FROM myTable
Where SIZE > 2000
ORDER BY NAME DESC
Run Code Online (Sandbox Code Playgroud)
然后以编程方式选择前N个记录.
这种方法的问题是:
我的问题是:
我们使用Visual Studio 2003(VC71)进行编译.为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译头文件(.pch).
makefile中使用的选项:
/Yc"StdAfx.h"
/Fp"StdAfx.pch"
Run Code Online (Sandbox Code Playgroud)
这样,目标的编译时间减少了30%.但是,任何人都可以帮助我理解即使每次编译每个CPP文件时生成pch文件,它如何减少编译时间.
还有,这是正确的方法吗?我们应该使用Yc和Yu组合吗?我不能使用/ Yu选项,因为pch文件应该至少生成一次.
c++ ×9
standards ×2
stl ×2
build ×1
const ×1
deque ×1
destructor ×1
new-operator ×1
oracle ×1
sorting ×1
sql ×1
sql-order-by ×1
visual-c++ ×1
volatile ×1
winapi ×1