Raymond Chen 在无 锁 algorithm 方面 做了大量的工作 。 除了InterlockedXxx函数的简单情况之外,似乎所有这些模式都是他们实现自己的锁 。 当然,没有处理器锁,但是为了确保一致性,在每个CPU上循环重复的概念非常像自旋锁。 作为自旋锁,它们将比操作系统附带的通用锁效率低,因为它们在等待其他线程时不会控制其量子块。 因此,当有人来找我说“但是我的algorithm是无锁的”时,我的总体回答是“如此”? 我很好奇 – 是否有基准显示locking自由algorithm有优势locking全面的对手?
在我的multithreading应用程序中,我看到了严重的锁争用,阻止了多核心之间的良好可伸缩性。 我决定使用无锁编程来解决这个问题。 我怎样才能写一个无锁结构?
我正在一个数据库中,我通过数据加载器加载一个原始表中的数据。 但是今天的数据加载程序由于未知的原因卡住了。 然后我停止从Windows任务pipe理器的数据加载器。 但是,我再次尝试加载原始表中的数据,但发现它被locking,我不能做任何操作。 我试过重新启动SQL Server服务,但没有解决。 而且我没有权限在这台服务器上终止进程。 以下是SQL Server显示的消息。 执行Transact-SQL语句或批处理时发生exception。 (Microsoft.SqlServer.ConnectionInfo) 计划地点: 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection查询) 在Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection查询,布尔includeDbContext) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImplWorker(String newName) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImpl(String newName) =================================== 超过locking请求超时时间。 参数@objname不明确,或者声明的@objtype(OBJECT)错误。 (.Net SqlClient数据提供程序) 服务器名称:162.44.25.59错误号:1222 严重性:16状态:56 过程:sp_rename行号:282 我的SQL Server版本是2008 R2。
可能重复: C#中的重入锁 如果我写这样的代码: class Program { static void Main(string[] args) { Foo(); Console.ReadLine(); } static void Foo() { lock(_lock) { Console.WriteLine("Foo"); Bar(); } } static void Bar() { lock(_lock) { Console.WriteLine("Bar"); } } private static readonly object _lock = new object(); } 我得到输出: Foo Bar 我预料到这会陷入僵局,因为Foo获得一个锁,然后等待Bar获得锁。 但是这不会发生。 locking机制是否只是允许这个,因为代码是在同一个线程上执行的?
说我有一个大型的数组,我想用多个线程处理内容。 如果我将每个线程委托给一个特定的部分,保证没有重叠,这是否消除了任何locking的需要,假设线程不访问数组之外的任何其他内存? 像这样的东西(伪代码): global array[9000000]; do_something(chunk) { for (i = chunk.start; i < chunk.end; i++) //do something with array } main() { chunk1 = {start: 0, end: 5000000}; chunk2 = {start: 5000000, end: 9000000}; start_thread(thread1, do_something(chunk1)); start_thread(thread2, do_something(chunk2)); wait_for_join(thread1); wait_for_join(thread2); //do something else with the altered array }
primefaces操作的成本是多less(任何比较和交换或primefaces增加/减less)? 它消耗多less个周期? 它会暂停SMP或NUMA上的其他处理器,还是会阻塞内存访问? 它会在无序的CPU中刷新重sorting缓冲区吗? 什么效果会在caching上? 我对现代stream行的CPU感兴趣:x86,x86_64,PowerPC,SPARC,Itanium。
我正在阅读Jon Skeet给出的一个问题的答案 ,并在其中提到了这个问题: 就我而言,无锁multithreading是针对真正的线程专家,我不是其中之一。 这不是我第一次听到这个消息,但是如果你有兴趣学习如何编写无锁multithreading代码,我发现很less有人谈论你是怎么做到的。 所以我的问题是除了学习所有你可以关于线程等,你开始试图学会专门写无锁multithreading代码,什么是一些很好的资源。 干杯
POSIX允许互斥体recursion。 这意味着相同的线程可以locking相同的互斥锁两次,不会死锁。 当然它也需要解锁两次,否则没有其他线程可以获得互斥量。 并不是所有支持pthread的系统都支持recursion互斥,但是如果他们想要符合POSIX,他们必须这样做 。 其他API(更高级别的API)通常也提供互斥锁,通常称为Locks。 一些系统/语言(例如Cocoa Objective-C)提供recursion和非recursion互斥。 一些语言也只提供一个或另一个。 例如在Java互斥体总是recursion的(同一个线程可能会在同一个对象上两次“同步”)。 根据他们提供的其他线程function,没有recursion互斥可能没有问题,因为他们可以很容易地自己写(我已经在更简单的互斥/条件操作的基础上自己实现recursion互斥)。 我真的不明白:什么是非recursion互斥体? 为什么我想要一个线程死锁,如果它locking相同的互斥锁两次? 即使是能够避免这种情况的高级语言(例如,如果这样做会死锁并抛出一个exception,通常也不会这样做)。 他们会让线程死锁。 这是唯一的情况下,我不小心locking了两次,只有一次解锁,并在recursion互斥的情况下,这将是很难find问题,所以相反,我立即死锁,看看哪里出现不正确的锁? 但是我不能在解锁时返回一个locking计数器,在这种情况下,我确信我释放了最后一个锁,而计数器不是零,我可以抛出exception或logging问题? 还是有没有其他更有用的非recursion互斥体的使用情况,我没有看到? 或者也许只是performance,因为非recursion互斥可以比recursion互斥略快一点? 但是,我testing了这个,差别并不大。
我有这样的东西: if (f = acquire_load() == ) { … use Foo } 和: auto f = new Foo(); release_store(f) 你可以很容易地想象一下,使用带有load(memory_order_acquire)和store(memory_order_release)的primefaces的acquire_load和release_store的实现。 但是现在如果release_store是通过_mm_stream_si64实现的,这是一个非暂时写入,而不是相对于x64上的其他存储进行sorting的呢? 如何获得相同的语义? 我认为以下是最低要求: atomic<Foo*> gFoo; Foo* acquire_load() { return gFoo.load(memory_order_relaxed); } void release_store(Foo* f) { _mm_stream_si64(*(Foo**)&gFoo, f); } 并如此使用它: // thread 1 if (f = acquire_load() == ) { _mm_lfence(); … use Foo } 和: […]
我已经在C ++中使用了一个非locking的队列。 我发现了一些代码和一些试验 – 但我没有能够编译。 无锁哈希也是受欢迎的。 总结:到目前为止,我没有正面的答案。 没有“生产准备”库,而且现有的库都不符合STL容器的API。