Windows提供了一个无锁的单链表,如本页所述: Win32 SList
我想知道这个功能是否存在一个好的C++包装器.当我说好的时候,我的意思是它尽可能地导出通常的STL接口,支持迭代器等.我宁愿使用别人的实现而不是坐下来编写STL类型的容器.
这是我正在维护的一些代码的简化版本:
int SomeFunc()
{
const long lIndex = m_lCurrentIndex;
int nSum = 0;
nSum += m_someArray[lIndex];
nSum += m_someArray[lIndex];
return nSum;
}
Run Code Online (Sandbox Code Playgroud)
lCurrentIndex由另一个线程定期更新.问题是; 将制作m_CurrentIndex的本地副本确保对m_someArray的两次访问都使用相同的索引?
请注意,这是一个简化的例子; 我正在考虑制作本地副本的概念,而不是这里显示的确切代码段.我知道编译器会将值放在寄存器中,但这仍然是本地副本,而不是从lCurrentIndex读取两次.
谢谢!
编辑:初始分配是安全的,在我们的设置中保证两者都是32位.Edit2:它们在32位边界上正确对齐(忘了那个)
在数据结构同步的背景下,有人可以澄清"无锁"和"非阻塞"之间的区别吗?这些术语似乎可以被很多人互换使用,但我还不确定某个地方是否隐藏着一些微妙的差异.
我的意思是无锁是"没有锁",非阻塞更像是保证进步.我怀疑一个暗示另一个而不是相反,我不确定.
参考文献欢迎.
原谅我的无知,但我对shell脚本和在Linux中使用环境变量有些新意.
我有一个执行MySQL数据库备份的脚本.我在脚本中有以下几行用于记录数据库的成功转储:
output=`date; echo "Database export successful from $ENV_HOSTNAME to $BACKUP_HOSTNAME"`
echo $output >> /var/log/errorLog
Run Code Online (Sandbox Code Playgroud)
我在/ etc/profile中定义了变量(ENV_HOSTNAME和BACKUP_HOSTNAME),如下所示:
export ENV_HOSTNAME="env1.somename.com"
export BACKUP_HOSTNAME="env2.somename.com"
Run Code Online (Sandbox Code Playgroud)
当我调用printenv时,我可以看到列出的这些变量,并且当我运行此脚本(以root身份)时,变量值正确显示在日志文件中.但是,当我将此脚本设置为使用cron运行时,变量值不会出现在日志文件中.我知道脚本运行是因为我可以看到日期和字符串的其余部分,但变量是空白的:
Fri Nov 6 22:31:05 EST 2009 Database export successful from to
Run Code Online (Sandbox Code Playgroud)
我确定我在这里遗漏了一些简单的东西,所以请提前感谢您的帮助.
嗨我试着写一个无锁列表我得到了添加部分工作它认为但从列表中提取对象的代码不起作用:(
那么这个列表不是一个正常的列表..我有接口IWorkItem
interface IWorkItem
{
DateTime ExecuteTime { get; }
bool Cancelled { get; }
void Execute(DateTime now);
}
Run Code Online (Sandbox Code Playgroud)
好吧,我有一个列表,我可以添加这个:P和idear是我运行Get(); 在列表上它应该循环它,直到它找到一个IWorkItem
If (item.ExecuteTime < DateTime.Now)
Run Code Online (Sandbox Code Playgroud)
并将其从列表中删除并返回..我已经在我的双核cpu上运行了多个线程的测试,看起来Add工作到目前为止从未失败但是Get函数丢失了一些工作项,其中我没有想法什么是错的.. ...
ps如果我得到这个工作任何人都可以免费使用代码:)你有什么办法,但我不明白它的错误点:P
代码在这里http://www.easy-share.com/1903474734/LinkedList.zip,如果你试图运行它,你会发现它有时会无法获得尽可能多的工作项列表...
编辑:我有一个无锁列表工作它比使用锁(obj)语句更快,但我有一个锁定对象使用Interlocked仍然超出无锁列表,即时尝试制作一个无锁arraylist和se如果我当我完成后,在这里得到相同的结果上传结果..
我制作了几个宏,使得使用新的放置更容易一些.我只是想知道是否有任何明显的情况,这些都不会起作用.谢谢.
#define CONSTRUCT_INPLACE(TYPE,STORAGE,INIT) ::new((TYPE*)STORAGE) TYPE INIT
#define DESTRUCT_INPLACE(TYPE,STORAGE) ((TYPE*)STORAGE)->~TYPE()
Run Code Online (Sandbox Code Playgroud) 如果你有一个像"C:\ foo \.\ bar\.."的路径,有一种简单的方法使用Win32 API删除目录限定符,以便将其简化为"C:\ foo"?
更新:这似乎是一个更复杂的问题.在这个简单的"C:\ foo \.\ bar\.."示例中,它与PathCanonicalize()和GetFullPathName()一起使用以获得"C:\ foo"作为结果.
但是,我传递的路径有一个符号链接.所以,假设我传入的是"C:\ NaNa\Boo\Bin\..","C:\ NaNa"是指向"D:\ Apple"的链接.然后我得到"C:\ NaNa\Boo\Bin\.."回复率比"C:\ NaNa\Boo"
我会假设函数只使用字符串,但使用符号链接似乎有所不同:-(
更新#2:看来我传入的字符串中有换行符(0x0d),这使得函数无法正常工作!
我有一些代码可以在 MSVC++ 上编译和运行,但不能在 GCC 上编译。我制作了一个测试片段如下。我的目标是将静态方法从 BFSMask 移至 BFSMaskSized。有人可以解释一下错误发生了什么(特别是奇怪的“operator<”错误)吗?谢谢。
如果两个 #define 都为 0,则代码可以在 GCC 上编译。
#define DOESNT_COMPILE_WITH_GCC 0
#define FUNCTION_IN_PARENT 0
Run Code Online (Sandbox Code Playgroud)
如果将 #define 更改为 1,则会出现错误。以下是我看到的错误。
#define DOESNT_COMPILE_WITH_GCC 0
#define FUNCTION_IN_PARENT 1
Test.cpp: In static member function 'static typename Snapper::BFSMask<T>::T_Parent::T_SINT Snapper::BFSMask<T>::Create_NEZ(TCMP)':
Test.cpp(492): error: 'CreateMaskFromHighBitSized' was not declared in this scope
#define DOESNT_COMPILE_WITH_GCC 1
#define FUNCTION_IN_PARENT 0
Test.cpp: In static member function 'static typename Snapper::BFSMask<T>::T_Parent::T_SINT Snapper::BFSMask<T>::Create_NEZ(TCMP) [with TCMP = int, T = int]':
Test.cpp(500): instantiated from 'TVAL Snapper::BFWrappedInc(TVAL, TVAL, TVAL) [with TVAL = …Run Code Online (Sandbox Code Playgroud)