小编Adi*_*sak的帖子

围绕Win32的无锁SList是否有一个不错的C++包装?

Windows提供了一个无锁的单链表,如本页所述: Win32 SList

我想知道这个功能是否存在一个好的C++包装器.当我说好的时候,我的意思是它尽可能地导出通常的STL接口,支持迭代器等.我宁愿使用别人的实现而不是坐下来编写STL类型的容器.

c++ windows linked-list lock-free

3
推荐指数
1
解决办法
1302
查看次数

这段代码是线程安全的吗?

这是我正在维护的一些代码的简化版本:

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位边界上正确对齐(忘了那个)

c++ thread-safety lock-free

3
推荐指数
2
解决办法
451
查看次数

无锁和无阻塞有什么区别?

在数据结构同步的背景下,有人可以澄清"无锁"和"非阻塞"之间的区别吗?这些术语似乎可以被很多人互换使用,但我还不确定某个地方是否隐藏着一些微妙的差异.

我的意思是无锁是"没有锁",非阻塞更像是保证进步.我怀疑一个暗示另一个而不是相反,我不确定.

参考文献欢迎.

synchronization locking nonblocking lock-free

3
推荐指数
1
解决办法
2043
查看次数

shell脚本中使用的环境变量在由cron运行时在日志文件中显示为空白

原谅我的无知,但我对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)

我确定我在这里遗漏了一些简单的东西,所以请提前感谢您的帮助.

linux shell scripting environment-variables

3
推荐指数
2
解决办法
3148
查看次数

无锁列表帮助!

嗨我试着写一个无锁列表我得到了添加部分工作它认为但从列表中提取对象的代码不起作用:(

那么这个列表不是一个正常的列表..我有接口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如果我当我完成后,在这里得到相同的结果上传结果..

c# multithreading lock-free

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

这些放置新宏是否正确?

我制作了几个宏,使得使用新的放置更容易一些.我只是想知道是否有任何明显的情况,这些都不会起作用.谢谢.

#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++ macros placement-new

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

如何使用Win32 API删除目录限定符以简化路径名?

如果你有一个像"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),这使得函数无法正常工作!

c++ winapi pathname

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

GCC 在模板化父类中调用静态模板函数的问题

我有一些代码可以在 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)

gcc templates

0
推荐指数
1
解决办法
1352
查看次数