我正在使用一个使用用户级上下文切换的运行时库(使用Boost :: Context),并且在使用thread_level变量时遇到了麻烦.考虑以下(简化)代码:
thread_local int* volatile tli;
int main()
{
tli = new int(1); // part 1, done by thread 1
UserLevelContextSwitch();
int li = *tli; // part 2, done by thread 2
cout << li;
}
Run Code Online (Sandbox Code Playgroud)
由于对thread_local变量有两次访问,因此编译器将main函数转换为沿着这些行的某些东西(与汇编相反):
register int** ptli = &tli; // cache address of thread_local variable
*ptli = new int(1);
UserLevelContextSwitch();
int li = **ptli;
cout << li;
Run Code Online (Sandbox Code Playgroud)
这似乎是一种合法的优化,因为volatile 的值tli不会缓存在寄存器中.但是, volatile 的地址tli实际上是缓存的,而不是从第2部分的内存中读取的.
这就是问题:在用户级上下文切换之后,执行第1部分的线程会转到其他位置.然后,第2部分由其他线程获取,该线程获得先前的堆栈和寄存器状态.但是现在正在执行第2部分的线程读取tli属于线程1的值.
我试图找出一种方法来阻止编译器缓存线程局部变量的地址,并且 …
在关于使用typeid is C++的问题中,我建议它可以用来比较对象比较中的类型.我没有看到它做得太多,但我考虑到了Java equals.
再看看Java,似乎就是这种情况:有人说应该比较两个对象的实际类,有人说 instanceof是正确使用的工具,可能是双重调度.当然,有两种情况中的一种最终更合适,但至少考虑两种选择.
在C++,OTOH中,我几乎找不到比较实际类型的代码.在大多数情况下,使用双重调度(with dynamic_cast),我找不到任何坚持快速类型比较的人在相等检查开始时做正确的事情.
我想知道为什么多态类型比较的问题在Java中有两个可接受的解决方案,而在C++中,只有一个似乎被认为是最佳实践?是否存在重大的技术差异,或者只是不同的方法?
注意:我的主张是基于印象而非具体知识.如果它们是错的并且Java和C++在这方面确实相似 - 或者由于上述原因之外的其他原因而不同,那么它显然是一个可接受的答案.
我已经尝试了谷歌搜索,并且基于各种具体情况有很多答案,坦率地说,我比我开始时更加困难.
事实如下:
请帮助我,修复当前在CreateDirectory上的尝试或使用其他东西来创建目录.
谢谢!
我们的服务往往在客户服务器的夜晚入睡,然后很难醒来.似乎发生的事情是进程堆(有时几百MB)被移动到交换文件中.这种情况发生在晚上,当我们的服务没有使用时,其他人计划运行(数据库备份,AV扫描等).发生这种情况时,在几小时不活动后,对服务的第一次呼叫需要几分钟(随后的呼叫需要几秒钟).
我很确定这是一个虚拟内存管理问题,我真的很讨厌强迫操作系统将我们的服务保留在物理内存中.我知道这样做会损害服务器上的其他进程,并降低整体服务器吞吐量.话虽如此,我们的客户只是想让我们的应用程序响应.他们不关心夜间工作需要更长时间.
我依旧记得有一种方法可以强制Windows将页面保留在物理内存中,但我真的很讨厌这个想法.我更倾向于一些内部或外部监视器,它将启动更高级别的功能(已经有一些内部调度程序做得很少,没有任何区别).如果有第三方工具提供的那种服务本来就一样好.
我很想听到有关此类问题的任何意见,建议和常见解决方案.该服务使用VC2005编写,可在Windows服务器上运行.
我们正在寻找一种在我们的网页中保护第三方代码的方法.有人建议我们使用Caja.我调查了一下,但有关它的信息很少.在深入研究之前,我首先想知道:
Caja可以像谷歌地图一样处理嵌入式HTML,它可以有效地作为引导程序,并在浏览器运行时加载所有活动的HTML和JavaScript吗?
Caja是否足够成熟,可以在生产环境中使用,还是处于概念阶段?
谢谢,伊兰
为了能够正确调试发布版本,需要一个PDB文件.当编译器使用不同类型的优化(FPO,PGO,内部函数,内联等)时,PDB文件是否会变得不太可用?如果是这样,优化效果是否严重或仅仅导致相邻的代码行混淆?
(我正在使用VC2005,并且总是选择可调试性而非优化性能 - 但问题是一般的)
在我们的应用程序中,只有在执行后续更新后才会提交数据库更新(当然,两者都使用相同的事务).但是,我们发现了一个罕见的流程,用户在第二次更新之前退出应用程序,导致第一次丢弃.我正在寻找一种方法来在退出时识别这个未提交的更新.
我知道这样的问题需要重新设计,但这是不可能的.由于流程和应用程序结构的稀缺性,我想知道是否有办法只检查事务本身的未提交更新.
问题对Oracle和SQLServer有效.该应用程序是用PowerBuilder编写的,但如果重要的话,它可以通过各种方式扩展(.NET,Win32等).
我是C++/CLI的新手,所以请耐心等待......
我正在研究一个混合的C++/CLI DLL,它应该充当Win32进程和.NET程序集之间的桥梁.在DLL中,我需要在DLL的生命周期中存在一些.NET内容.初始化不是一个大问题,但我无法弄清楚何时可以安全地清理.NET内容.在CLR消失之后,似乎都会调用通常的C++工具(DLL_PROCESS_DETACH,全局变量和静态局部变量).
那么,获取通知DLL即将从CLR分离的方式是什么,所以我可以发布我持有的.NET引用?
假设我有一个位图,并且几个线程(在多个CPU上运行)正在设置位.没有使用同步,也没有原子操作.此外,没有重置.据我所知,当两个线程试图在同一个字上设置两个位时,最终只会有一个操作.原因是对于要设置的位,应该读取和写回整个字,因此当两个读取同时完成时,当写回时,一个操作将覆盖另一个操作.那是对的吗?
如果上述情况属实,那么字节操作也是如此吗?也就是说,如果一个单词是2个字节,并且每个线程都试图将不同的字节设置为1,那么当它们同时完成时它们是否也会相互覆盖,或者某些系统是否支持将结果写回到单词的一部分?
询问的原因是试图弄清楚我必须放弃多少空间才能省略位/字节/字图操作中的同步.
我发现boost有一个叫做context的类,用于上下文切换,对吧?
我尝试谷歌它但没有找到任何文件或例子.我只是想知道是否有人可以提供一些信息.
c++ ×6
windows ×2
.net ×1
assembly ×1
boost ×1
c++-cli ×1
commit ×1
dll ×1
equals ×1
java ×1
javascript ×1
memory ×1
optimization ×1
oracle ×1
pagefile ×1
pdb-files ×1
performance ×1
powerbuilder ×1
security ×1
sql-server ×1
thread-local ×1
transactions ×1
volatile ×1
winapi ×1