有人知道完全线程安全的shared_ptr实现吗?例如,boost实现shared_ptr对于目标(引用计数)是线程安全的,并且对于同时shared_ptr实例读取也是安全的,但不是写入或读/写.
(参见Boost docs,例3,4和5).
是否存在对shared_ptr实例完全线程安全的shared_ptr实现?
提升文档的人说:
shared_ptr对象提供与内置类型相同的线程安全级别.
但是如果你比较一个普通的指针(内置类型)smart_ptr,那么同时写一个普通的指针是线程安全的,但同时写入a smart_ptr不是.
编辑:我的意思是x86架构上的无锁实现.
EDIT2:这种智能指针的一个示例用例是有许多工作线程,它们使用当前工作项更新全局shared_ptr,并使用监视器线程获取工作项的随机样本.shared-ptr将拥有该工作项,直到为其分配了另一个工作项指针(从而销毁了以前的工作项).监视器将获得工作项的所有权(从而防止工作项被销毁),方法是将其分配给自己的shared-ptr.它可以通过XCHG和手动删除来完成,但如果共享ptr可以做到这一点会很好.
另一个例子是全局shared-ptr拥有"处理器",由某个线程分配,并由其他一些线程使用.当"用户"线程看到处理器shard-ptr为NULL时,它使用一些替代逻辑来进行处理.如果它不是NULL,它会通过将处理器分配给它自己的shared-ptr来防止处理器被破坏.
我有一个高级目标,即创建一个静态实用程序类,它封装了我的.NET应用程序的加密.在里面,我想尽量减少不必要的对象创作.
我的问题是:在.NET Framework中实现对称加密的类的线程安全性是什么? 具体而言System.Security.Cryptography.RijndaelManaged,ICryptoTransform它产生的类型.
例如,在我的类构造函数中,我可以简单地按照以下行执行某些操作吗?
static MyUtility()
{
using (RijndaelManaged rm = new RijndaelManaged())
{
MyUtility.EncryptorTransform = rm.CreateEncryptor(MyUtility.MyKey, MyUtility.MyIV);
MyUtility.DecryptorTransform = rm.CreateDecryptor(MyUtility.MyKey, MyUtility.MyIV);
}
}
Run Code Online (Sandbox Code Playgroud)
在这个类中存在Key和IV是安全的问题,这个示例块提出了许多其他问题:
我可以一遍又一遍地重复使用EncryptorTransform和DecryptorTransform吗?这些*.CanReuseTransform和*.CanTransformMultipleBlocks属性意味着"是",但是我应该注意哪些警告?
因为RijndaelManaged实现IDisposable我倾向于把它放在一个using块中,特别是因为它可能与外部操作系统级别的lib相关联.有什么警告,因为我保持ICryptoTransform周围的物体?
可能是最重要的问题,在高度多线程的环境中,我会遇到ICryptoTransform在线程之间共享对象的问题吗?
如果对#3的回答是它不是线程安全的,那么当我使用这些ICryptoTransform对象时,我是否会因锁定而导致严重的性能下降?(取决于负载我想.)
RijndaelManaged每次只是简单地实例化它会更高效吗?或者存储一个RijndaelManaged并new RijndaelManaged().CreateEncryptor(...)每次生成?
我希望那里的某些人知道这些工作是如何工作的,或者是在类似实现方面遇到的问题.我发现很多这些性能和线程相关的问题通常都没有表现出来,直到有相当大的负载.
谢谢!
我一直在使用NHibernate一段时间,并且不时发现如果我尝试同时请求两个页面(或尽可能接近),它偶尔会出错.所以我认为这是因为我的会话管理不是线程安全的.
我认为这是我的课程,所以我尝试使用此博客文章中的不同方法http://pwigle.wordpress.com/2008/11/21/nhibernate-session-handling-in-aspnet-the-easy-way/但是我仍然遇到同样的问题.我得到的实际错误是:
Server Error in '/AvvioCMS' Application.
failed to lazily initialize a collection, no session or session was closed
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: NHibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
Run Code Online (Sandbox Code Playgroud)
这个或没有datareader是开放的,但这是罪魁祸首.
我把会话管理课放在下面,有人能说出我为什么会遇到这些问题吗?
public interface IUnitOfWorkDataStore
{
object this[string key] { get; set; } …Run Code Online (Sandbox Code Playgroud) 对于学校的项目,我们在Java 5.0中创建一个多线程服务器.该项目以服务器的并发方面为中心.
我们有一些致力于处理请求的线程.为此,他们调用ServerSocket.accept()来接受新连接.我们的选择是启动一堆它们并让它们处理传入的连接,假设两个线程不能同时接受()相同的连接.
但现在主要的问题是我们在API中找不到保证我们这种行为的任何东西(或者我们看起来不对),除了"它的工作"证明之外什么都没有.
有人来源寻找有关java方法的这类信息吗?
Boost C++库具有Function Template tee
类模板tee_filter和tee_device提供了两种分割输出序列的方法,以便将所有数据同时定向到两个不同的位置.
我正在寻找一个完整的C++示例,使用Boost tee输出到标准输出和像"sample.txt"这样的文件.
如果我将我的代码文件保存为.pyw,则不会出现控制台窗口 - 这就是我想要的 - 但如果代码包含调用os.system,我仍然会得到一个讨厌的控制台窗口.我认为这是由呼叫引起的os.system.有没有办法从我的.pyw脚本中执行其他文件而根本不提高控制台窗口?
我想添加一些额外的include/lib目录以及MinGW的默认目录,以便在编译时进行搜索.原因是因为我目前安装MinGW的硬盘几乎已满,所以我不得不将Qt安装到我的第二个.因此,我如何让MinGW默认包含Qt文件?
搜索谷歌+github +ssh "no address associated with name"提供以下SO问题作为4个最佳结果:
github没有与名称关联的地址
Github push origin master not working
与github GITHUB设置同步
- 没有与name关联的地址
但是,他们都没有回答我的问题.
c:\Program Files (x86)\Git\bin>git --version
git version 1.7.7.1.msysgit.0
c:\Program Files (x86)\Git\bin>ssh git@github.com
Enter passphrase for key '/c/Users/Piotr/.ssh/id_rsa':
Hi piotr-dobrogost! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
c:\Program Files (x86)\Git\bin>git clone ssh://git@github.com:piotr-dobrogost/requests.git
Cloning into requests...
ssh: github.com:piotr-dobrogost: no address associated with name
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)
我猜这个问题是由git github.com:piotr-dobrogost作为主机名传递给ssh …
我正在尝试将数据文件包含在我的包中的distutils中,然后使用相对路径引用它们(参见http://docs.python.org/distutils/setupscript.html#distutils-additional-files)
我的目标结构是:
myproject/
mycode.py
data/
file1.dat
Run Code Online (Sandbox Code Playgroud)
代码mycode.py,实际上是包中的脚本.它依赖于访问data/file1.dat,使用相对路径引用它.在setup.py,我有:
setup(
...
scripts = "myproject/mycode.py"
data_files = [('data', 'myproject/data/file1.dat')]
)
Run Code Online (Sandbox Code Playgroud)
假设用户现在使用:
python setup.py --prefix=/home/user/
Run Code Online (Sandbox Code Playgroud)
然后mycode.py会出现在某些地方/home/user/bin/.但是data/file1.dat现在已经破坏了引用,因为脚本存在于数据的其他地方.
我怎样才能找到mycode.py绝对路径myproject/data/file1.dat,所以我可以根据用户安装包的位置正确引用它?
编辑
当我安装这个prefix=/home/user/,我得到data/file1.dat创造了/home/user/这正是我想要的,唯一缺少的部分是如何检索,只给出一个相对路径,不知道在用户安装的程序包的绝对路径该文件编程.当我尝试使用package_data而不是data_files,它不起作用 - 我只是不在data/file1.dat任何地方创建,即使我删除我的MANIFEST文件.
我已经阅读了目前关于这个看似非常普遍的问题的所有讨论.然而,所有提出的解决方案都没有处理我上面的情况,其中需要访问的代码data_files是脚本,其位置可能会根据--prefix参数而改变setup.py.我能想到的解决这个问题的唯一黑客是添加数据文件scripts=中setup(),如:
setup(
...
scripts = ["myproject/mycode.py", "myproject/data/file1.data"]
)
Run Code Online (Sandbox Code Playgroud)
这是一个可怕的黑客,但它是我能想到的唯一方法,以确保 …
c++ ×3
python ×3
git ×2
windows ×2
asp.net ×1
boost ×1
c# ×1
console ×1
cryptography ×1
distutils ×1
dvcs ×1
encryption ×1
github ×1
httpcontext ×1
include ×1
java ×1
mingw ×1
nhibernate ×1
packaging ×1
pythonw ×1
qt ×1
setuptools ×1
shared-ptr ×1
ssh ×1