问题列表 - 第15329页

序列点是否会阻止代码在关键部分边界重新排序?

假设有一个基于锁的代码,如下所示,其中互斥体用于防止不适当的并发读写

mutex.get() ; // get a lock.

T localVar = pSharedMem->v ; // read something
pSharedMem->w = blah ; // write something.
pSharedMem->z++ ;      // read and write something.

mutex.release() ; // release the lock.
Run Code Online (Sandbox Code Playgroud)

如果假设生成的代码是按程序顺序创建的,则仍然需要适当的硬件内存屏障,如isync,lwsync,.acq,.rel.我假设这个问题是互斥实现负责这个部分,提供一个保证pSharedMem读取和写入都发生在"get"之后,"之前"发布()[但周围的读写可以进入关键部分,因为我期望是互斥实现的标准].我还假设在适当的情况下在互斥体实现中使用volatile访问,但是volatile不用于受互斥体保护的数据(理解为什么volatile似乎不是受互斥保护的数据的必要数据实际上是这个问题).

我想了解是什么阻止编译器移动关键区域之外的pSharedMem访问.在C和C++标准中,我看到有一个序列点的概念.我发现标准文档中的大部分序列点文本都是不可理解的,但是如果我要猜测它是什么,那么声明代码不应该在有未知副作用的调用的点上重新排序.这是它的主旨吗?如果是这种情况,编译器在这里有什么样的优化自由度?

随着编译器进行棘手的优化,例如配置文件驱动的过程间内联(甚至跨文件边界),甚至未知副作用的概念也会变得模糊.

在这里以自包含的方式解释这个问题可能超出了一个简单问题的范围,因此我很容易被指向引用(最好是在线并且针对凡人程序员而不是编译器编写者和语言设计者).

编辑:(回应Jalf的回复)

我提到了像lwsync和isync这样的内存屏障指令,因为你还提到了CPU重新排序问题.我碰巧在与编译器工作者相同的实验室工作(至少对于我们的平台之一),并且已经与内在函数的实现者交谈过,我碰巧知道至少对于xlC编译器__isync()和__lwsync()(其余的原子内在函数)也是代码重新排序的障碍.在我们的自旋锁实现中,编译器可以看到这一点,因为我们的关键部分的这一部分是内联的.

但是,假设您没有使用自定义构建锁实现(就像我们碰巧那样,这可能不常见),并且只调用了一个通用接口,例如pthread_mutex_lock().在那里,编译器不会通知原型.我从未见过它表明代码不起作用

pthread_mutex_lock( &m ) ;
pSharedMem->someNonVolatileVar++ ;
pthread_mutex_unlock( &m ) ;

pthread_mutex_lock( &m ) ;
pSharedMem->someNonVolatileVar++ ;
pthread_mutex_unlock( &m ) ;

除非将变量更改为volatile,否则将无法正常工作.该增量将在每个背靠背代码块中具有加载/增量/存储序列,并且如果第一增量的值在第二个寄存器中保留,则将不能正确地操作.

似乎pthread_mutex_lock()的未知副作用可以保护这种背靠背增量示例不正常行为.

我在谈论自己的结论,在线程环境中这样的代码序列的语义并没有真正严格地涵盖在C或C++语言规范中.

c++ concurrency multithreading locking

17
推荐指数
1
解决办法
3218
查看次数

svn日志缺少修订版

我似乎缺少修订版.我写

> svn commit -m "blah. go back"
Sending        report/report2.pl
Transmitting file data .
Committed revision 6.

> svn info
Path: .
URL: file:///home/MYNAME/svn_repository
Repository Root: file:///home/MYNAME/svn_repository
Repository UUID: 05a62b19-7276-0410-ba54-59ad643a30b7
Revision: 3
Node Kind: directory
Schedule: normal
Last Changed Author: MYNAME
Last Changed Rev: 3
Last Changed Date: 2009-10-21 09:52:02 -0400 (Wed, 21 Oct 2009)
Run Code Online (Sandbox Code Playgroud)

嗯......我以为我是修订版6.

如果我尝试合并到旧版本,我的修订似乎仍然存在

linux svn

5
推荐指数
1
解决办法
1428
查看次数

你如何在javascript中撤消"surroundContents"?

我正在编写一个需要在页面上移动包装节点元素的脚本.我发现当我这样做时,我会移除以前包裹的孩子.如何取消节点的子节点,以便将父节点移动到其他位置?

我在想这样的事情:

  var parg = document.getElementById("blah");

  if (parg.hasChildNodes())
   {
     var children = parg.childNodes;
     while (children.length > 0)
     {
      parg.insertBefore(parg.firstChild);
      parg.removeChild(parg.firstChild);
     };
   };
Run Code Online (Sandbox Code Playgroud)

我猜测的问题是"insertBefore"逻辑.

javascript removechild

6
推荐指数
1
解决办法
1174
查看次数

什么是Javascript方法CollectGarbage()?何时以及为何应该使用它?

我注意到在VS2010 javascript intellisence中有一个名为CollectGarbage()的方法.

这是IE唯一的方法吗?
什么时候应该使用?
使用它有哪些优点(或缺点)?

javascript jscript

14
推荐指数
1
解决办法
1万
查看次数

设置Web应用程序项目的程序集名称

如何设置Web应用程序项目的程序集名称?

MSDN文档中的以下页面显示"因为此编译模型创建单个程序集,您可以指定属性,例如程序集名称和版本".http://msdn.microsoft.com/en-us/library/aa983464.aspx.

但是我无法解决你怎么做到这一点!

asp.net

2
推荐指数
1
解决办法
2348
查看次数

Windows:更改 Exe 的 DLL 搜索顺序

我的应用程序目录中有一个 C++ Exe,其中包含它使用的 DLL。现在,出于某些测试目的,我需要修改现有的 DLL 并使用它来代替原始的 DLL。但为了不修改现有的安装,我无法备份现有的 DLL 并将其替换为修改后的 DLL 或将现有的 DLL 移至其他地方。我也无法更改 Exe。这两个 DLL 需要并排存在。唯一的变化应该是 Exe 应该透明地加载位于其他文件夹中的修改后的 DLL,而不是加载与 Exe 位于同一文件夹中的现有 DLL。有一些优雅的方法吗?

我查看了一些 MSDN 文章,但找不到执行此操作的方法。该解决方案应该适用于 Windows XP 及更高版本。

c++ windows dll exe

5
推荐指数
1
解决办法
3608
查看次数

UISearchBar和UINavigationItem

我似乎无法让UISearchBar从导航栏中的最左侧到最右侧定位.在 - (void)viewDidLoad方法中,我有以下代码:

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];
Run Code Online (Sandbox Code Playgroud)

当你构建和运行时,乍一看它看起来很好.但是,仔细观察,你可以看出左边有一个边距/空格.这在宏观计划中并不是什么大不了的事,但当我点击搜索栏开始搜索时,我会将取消按钮设置为视图.因为搜索栏位于右侧略微位置,所以动画不稳定,取消按钮会像这样掉落: 链接文本

似乎UINavigationItem就像一个有三个单元格的表,在第一个和最后一个上面有一个我无法删除的填充 - 似乎也没有办法将它们"合并"在一起然后放置搜索栏那里.我知道这种外观是可能的,因为AppStore搜索在导航栏中有一个搜索栏,它一直到边缘.任何人都知道如何让搜索栏一直到边缘,所以我的滑入取消按钮动画将正常工作?

iphone uisearchbar uinavigationitem

2
推荐指数
1
解决办法
8293
查看次数

如何在UILabel文本中显示版权图标?

有没有人知道如何在UILabel文本中显示版权图标?这是c周围有一个圆圈的图标.它的html代码是:©©.

我尝试了以下代码:

UILabel *contactInfo = [[UILabel alloc] initWithFrame:CGRectMake(-55,135,420,100)];
contactInfo.text = @"'©):'2009 Nationwide ";
Run Code Online (Sandbox Code Playgroud)

要么

contactInfo.text = @"'©'2009 Nationwide ";
Run Code Online (Sandbox Code Playgroud)

要么

contactInfo.text = @"©2009 Nationwide ";
Run Code Online (Sandbox Code Playgroud)

它只是将所有内容打印为文本而不是图标.

这可以在webView中使用,但我需要它作为UILabel文本.有帮助吗?

iphone icons special-characters uilabel

13
推荐指数
4
解决办法
1万
查看次数

如何为实体框架复杂类型添加导航属性

我正在使用VS2010 Beta 2,我有一个名为Address的复杂类型,具有以下属性:

  • CountryId

我有一个国家实体在我的模型中定义,但我似乎无法找到一种方法,从添加引用(导航属性)CountryId我的复杂类型的财产编号我的财产国家实体.

我是以错误的方式来做这件事,还是我不能与设计师做的事情?......

我有另一个选择就是创建一个Address实体,但它对我来说听起来不对.

linq-to-entities entity-framework visual-studio

5
推荐指数
2
解决办法
4508
查看次数

使用EWS API搜索不同的用户邮箱

我们正在开发一个模块,其主要目标是跟踪和收集有关损害检查(保险市场)的信息.每个案例都有一个代码(例如L000525).每个案例都可以由几个人管理.与特定案例相关的所有电子邮件都包含主题中的案例代码.

我们想要做的是收集并显示与每个特定案例相关的传入和发送的电子邮件.

我们的想法是,任何用户都可以打开"案例管理"窗口,选择特定案例,然后获取所有相关信息(当然包括电子邮件).

我们必须在大约20个用户的邮箱中找到电子邮件.所以问题是:

  • 这是更好的方法吗?它会消耗大量的时间和资源吗?

我们是Exchange世界的新手,所以我们在考虑Exchange模仿,但我们根本不确定.该模块是在Silverlight 3,WCF,SQL Server + Exchange 2007中开发的.

exchange-server exchangewebservices

17
推荐指数
1
解决办法
2万
查看次数