- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
我在互联网上阅读了很多文档、文章和帖子。几乎每个人和任何地方都承认 SpinLock 对于短时间运行的代码片段来说更快,但我做了一个测试,在我看来,简单的 Monitor.Enter 比 SpinLock.Enter 工作得更快(测试是针对 .NET 4.5 编译的)
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Linq;
using System.Globalization;
using System.ComponentModel;
using System.Threading;
using System.Net.Sockets;
using System.Net;
class Program
{
static int _loopsCount = 1000000;
static int _threadsCount = -1;
static ProcessPriorityClass _processPriority = ProcessPriorityClass.RealTime;
static ThreadPriority _threadPriority = ThreadPriority.Highest;
static long _testingVar = 0;
static void Main(string[] args)
{
_threadsCount = Environment.ProcessorCount;
Console.WriteLine("Cores/processors count: {0}", Environment.ProcessorCount);
Process.GetCurrentProcess().PriorityClass = _processPriority;
TimeSpan tsInterlocked = ExecuteInterlocked();
TimeSpan tsSpinLock = ExecuteSpinLock();
TimeSpan tsMonitor = ExecuteMonitor();
Console.WriteLine("Test with interlocked: {0} ms\r\nTest with SpinLock: {1} ms\r\nTest with Monitor: {2} ms",
tsInterlocked.TotalMilliseconds,
tsSpinLock.TotalMilliseconds,
tsMonitor.TotalMilliseconds);
Console.ReadLine();
}
static TimeSpan ExecuteInterlocked()
{
_testingVar = 0;
ManualResetEvent _startEvent = new ManualResetEvent(false);
CountdownEvent _endCountdown = new CountdownEvent(_threadsCount);
Thread[] threads = new Thread[_threadsCount];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(() =>
{
_startEvent.WaitOne();
for (int j = 0; j < _loopsCount; j++)
{
Interlocked.Increment(ref _testingVar);
}
_endCountdown.Signal();
});
threads[i].Priority = _threadPriority;
threads[i].Start();
}
Stopwatch sw = Stopwatch.StartNew();
_startEvent.Set();
_endCountdown.Wait();
return sw.Elapsed;
}
static SpinLock _spinLock = new SpinLock();
static TimeSpan ExecuteSpinLock()
{
_testingVar = 0;
ManualResetEvent _startEvent = new ManualResetEvent(false);
CountdownEvent _endCountdown = new CountdownEvent(_threadsCount);
Thread[] threads = new Thread[_threadsCount];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(() =>
{
_startEvent.WaitOne();
bool lockTaken;
for (int j = 0; j < _loopsCount; j++)
{
lockTaken = false;
try
{
_spinLock.Enter(ref lockTaken);
_testingVar++;
}
finally
{
if (lockTaken)
{
_spinLock.Exit();
}
}
}
_endCountdown.Signal();
});
threads[i].Priority = _threadPriority;
threads[i].Start();
}
Stopwatch sw = Stopwatch.StartNew();
_startEvent.Set();
_endCountdown.Wait();
return sw.Elapsed;
}
static object _locker = new object();
static TimeSpan ExecuteMonitor()
{
_testingVar = 0;
ManualResetEvent _startEvent = new ManualResetEvent(false);
CountdownEvent _endCountdown = new CountdownEvent(_threadsCount);
Thread[] threads = new Thread[_threadsCount];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(() =>
{
_startEvent.WaitOne();
bool lockTaken;
for (int j = 0; j < _loopsCount; j++)
{
lockTaken = false;
try
{
Monitor.Enter(_locker, ref lockTaken);
_testingVar++;
}
finally
{
if (lockTaken)
{
Monitor.Exit(_locker);
}
}
}
_endCountdown.Signal();
});
threads[i].Priority = _threadPriority;
threads[i].Start();
}
Stopwatch sw = Stopwatch.StartNew();
_startEvent.Set();
_endCountdown.Wait();
return sw.Elapsed;
}
}
在具有 24 个 2.5 GHz 内核的服务器上,这个使用 x64 编译的应用程序产生了以下结果:
Cores/processors count: 24
Test with interlocked: 1373.0829 ms
Test with SpinLock: 10894.6283 ms
Test with Monitor: 1171.1591 ms
我编写了一个简单的程序来测试 CLH 锁的吞吐量。我的代码与“多核编程的艺术”书中描述的一样。接下来,我对不断变化的线程数运行计数器 10 秒,并将 counter/10.0 定义为吞吐量。 我的问题
我一直想知道它们是什么:每次我听到它们时,类似 future 派飞轮的设备的图像都会在我的脑海中跳舞(滚动?)...... 它们是什么? 最佳答案 当您使用常规锁(互斥锁、临界区等)时,操作系统会将您
SpinLock .Net 中的结构可用于管理多个线程对资源的访问。与普通锁不同,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。 其他线程原语(例如 Monitor 和 lock
我正在尝试使用 SpinLock,但即使是单线程控制台应用程序中的这个最基本的代码,当我调用SpinLock.Exit() 时也会引发以下异常 System.Threading.Synchroniza
信号量的当前实现是如何工作的?它使用自旋锁或信号吗? 如果使用信号,调度程序如何知道调用哪个? 还有它在用户空间是如何工作的?内核锁定推荐自旋锁,但用户空间不推荐。那么信号量在用户空间和内核空间的实现
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
这是一道面试题,面试过了。 如何在不使用mutex、semorphore、spinLock、futex的情况下实现线程同步? 给定 5 个线程,如何让其中的 4 个线程在同一点等待来自左侧线程的信号?
我最近从http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2下载了linux源代码。我在 linux-2.6.34.1\
考虑以下代码片段: #include DECLARE_TASKLET (test_tasklet, test_func, (unsigned long) &test_data); 从什么 ld 知道
我使用 linux-2.6.31.8 作为我的内核环境。现在我需要对内核中的票证自旋锁进行一些修改。但令我惊讶的是,ticket spinlock.h 文件根本不是由内核编译的。我通过添加一些非法的
我有一个设置,我需要锁定、读取一些数据、处理、写入一些数据,然后解锁。为此,我制作了一个锁定纹理为 layout(r32ui) coherent uniform uimage2D .临界区的数据也以类
我有一个在 24 核系统上生成的 linux 内核转储。大多数任务都停留在自旋锁上。有没有办法获得自旋锁的所有者? 最佳答案 自旋锁没有“所有者”的概念,互斥锁有。 所以实际上你想知道的是哪个进程持有
我正致力于在字符设备驱动程序中实现阻塞调用。我将 wait_queue_head_t 元素与 wait_queue_interruptible 和 wake_up_interruptible 调用结合
我在boost::smart_ptr中找到了以下自旋锁代码: bool try_lock() { return (__sync_lock_test_and_set(&v_, 1) == 0);
具有两个重载 operator() 函数的类从不同的线程调用。请参阅下面代码中的//注释。 优化器是否知道不要将 entryadd = mSpread * ENTRY_MULTIPLIER 移动到 l
Linux内核中的原始代码是: static inline void __raw_spin_lock_irq(raw_spinlock_t *lock) { local_irq_disable
我是一名优秀的程序员,十分优秀!