• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C# Threading.SpinWait类代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了C#中System.Threading.SpinWait的典型用法代码示例。如果您正苦于以下问题:C# SpinWait类的具体用法?C# SpinWait怎么用?C# SpinWait使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。



SpinWait类属于System.Threading命名空间,在下文中一共展示了SpinWait类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。

示例1: Main

    // Demonstrates: 
    //      SpinWait construction 
    //      SpinWait.SpinOnce() 
    //      SpinWait.NextSpinWillYield 
    //      SpinWait.Count 
    static void Main(){
        bool someBoolean = false;
        int  numYields   = 0;

        // First task: SpinWait until someBoolean is set to true
        Task t1 = Task.Factory.StartNew(() =>
            {
                SpinWait sw = new SpinWait();
                while (!someBoolean)
                {
                    // The NextSpinWillYield property returns true if 
                    // calling sw.SpinOnce() will result in yielding the 
                    // processor instead of simply spinning. 
                    if (sw.NextSpinWillYield) numYields++;
                    sw.SpinOnce();
                }

                // As of .NET Framework 4: After some initial spinning, 
                // SpinWait.SpinOnce() will yield every time.
                Console.WriteLine("SpinWait called {0} times, yielded {1} times", 
                                  sw.Count, numYields);
            });

        // Second task: Wait 100ms, then set someBoolean to true
        Task t2 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(100);
                someBoolean = true;
            });

        // Wait for tasks to complete
        Task.WaitAll(t1, t2);
    }
开发者ID:ppatoria,项目名称:SoftwareDevelopment,代码行数:38,代码来源:spinwait.cs


示例2: WaitAnyTest

		public void WaitAnyTest()
		{
			ParallelTestHelper.Repeat (delegate {
				int flag = 0;
				int finished = 0;
				
				InitWithDelegate(delegate {
					int times = Interlocked.Exchange (ref flag, 1);
					if (times == 1) {
						SpinWait sw = new SpinWait ();
						while (finished == 0) sw.SpinOnce ();
					} else {
						Interlocked.Increment (ref finished);
					}
				});
				
				int index = Task.WaitAny(tasks);
				
				Assert.IsTrue (flag == 1, "#1");
				Assert.AreEqual (1, finished, "#2");
				Assert.AreNotEqual (-1, index, "#3");
				
				Task.WaitAll (tasks);
			});
		}
开发者ID:TheRealDuckboy,项目名称:mono-soc-2008,代码行数:25,代码来源:TaskTest.cs


示例3: ExclusiveLock

        public static void ExclusiveLock(int lockId, Action method)
        {
            try
            {
                var spinWait = new SpinWait();
                while (true)
                {
                    int updVal = Interlocked.CompareExchange(ref currentlyHeldLockId, lockId, 0);
                    if (0 != updVal) break;
                    spinWait.SpinOnce();
                }
                exclusiveLockActive = true;

                if (currentlyHeldLockId == lockId)
                    method();

            }
            finally
            {
                exclusiveLockActive = false;

                if (currentlyHeldLockId == lockId)
                    currentlyHeldLockId = 0;
            }
        }
开发者ID:hpavlov,项目名称:occurec,代码行数:25,代码来源:NonBlockingLock.cs


示例4: ExecuteThreadSafeOnce

		public bool ExecuteThreadSafeOnce()
		{
			if (state == Initialized)
			{
				return false;
			}
			var inProgressByThisThread = Thread.CurrentThread.ManagedThreadId;
			var preexistingState = Interlocked.CompareExchange(ref state, inProgressByThisThread, NotInitialized);
			if (preexistingState == NotInitialized)
			{
				return true;
			}
			if (preexistingState == Initialized || preexistingState == inProgressByThisThread)
			{
				return false;
			}
#if DOTNET40
			var spinWait = new SpinWait();
			while (state != Initialized)
			{
				spinWait.SpinOnce();
			}
#else
			while (state != Initialized)
			{
				Thread.SpinWait(5);
			}
#endif
			return false;
		}
开发者ID:jmuralimohanbabu,项目名称:Castle.Windsor,代码行数:30,代码来源:ThreadSafeInit.cs


示例5: RunSpinWaitTests

        public static void RunSpinWaitTests()
        {
            SpinWait spinner = new SpinWait();

            spinner.SpinOnce();
            Assert.Equal(spinner.Count, 1);
        }
开发者ID:noahfalk,项目名称:corefx,代码行数:7,代码来源:SpinWaitTests.cs


示例6: SpinLock

		public SpinLock (bool trackId)
		{
			this.isThreadOwnerTrackingEnabled = trackId;
			this.threadWhoTookLock = 0;
			this.lockState = isFree;
			this.sw = new SpinWait();
		}
开发者ID:TheRealDuckboy,项目名称:mono-soc-2008,代码行数:7,代码来源:SpinLock.cs


示例7: EnterWriteLock

        public bool EnterWriteLock(bool block)
        {
            var start = HiResTimer.Now();
#if DEBUG
            if (m_lastWriteThreadID == Thread.CurrentThread.ManagedThreadId)
                throw new SynchronizationLockException("Write lock already owned by you");
#endif

            var sw = new SpinWait();
            do
            {
                // If there are no readers or writers, grab the write lock.
                var state = m_state;
                if (state == 0 &&
                    Interlocked.CompareExchange(ref m_state, MASK_WRITER_BIT, state) == state)
                {
#if DEBUG
                    m_lastWriteThreadID = Thread.CurrentThread.ManagedThreadId;
                    if (sw.Count > _spinThreshold)
                        Debug.Print("EnterWriteLock: {0} spins ({1:F1}ms)", sw.Count, HiResTimer.ToTimeSpan(HiResTimer.Now() - start).TotalMilliseconds);
#endif
#if DEBUG_ReaderWriterSpinLock
                    if (ID != 0)
                        Debug.Print("{0} Enter Write on #{1} ({2})", Thread.CurrentThread.ManagedThreadId, ID, m_lastWriteThreadID);
#endif

                    return true;
                }

                sw.SpinOnce();
            }
            while (block);
            return false;
        }
开发者ID:filmackay,项目名称:live,代码行数:34,代码来源:ReaderWriterSpinLock.cs


示例8: WaitFor

        /// <summary>
        /// Wait for the given sequence to be available with a timeout specified.
        /// </summary>
        /// <param name="sequence">sequence to be waited on.</param>
        /// <param name="cursor">cursor on which to wait.</param>
        /// <param name="dependents">dependents further back the chain that must advance first</param>
        /// <param name="barrier">barrier the processor is waiting on.</param>
        /// <param name="timeout">timeout value to abort after.</param>
        /// <returns>the sequence that is available which may be greater than the requested sequence.</returns>
        /// <exception cref="AlertException">AlertException if the status of the Disruptor has changed.</exception>
        public long WaitFor(long sequence, Sequence cursor, Sequence[] dependents, ISequenceBarrier barrier, TimeSpan timeout)
        {
            long availableSequence;
            var spinWait = new SpinWait();
            var sw = Stopwatch.StartNew();

            if (dependents.Length == 0)
            {
                while ((availableSequence = cursor.Value) < sequence) // volatile read
                {
                    barrier.CheckAlert();
                    spinWait.SpinOnce();

                    if (sw.Elapsed > timeout)
                    {
                        break;
                    }
                }
            }
            else
            {
                while ((availableSequence = Util.GetMinimumSequence(dependents)) < sequence)
                {
                    barrier.CheckAlert();
                    spinWait.SpinOnce();

                    if (sw.Elapsed > timeout)
                    {
                        break;
                    }
                }
            }

            return availableSequence;
        }
开发者ID:TimGebhardt,项目名称:Disruptor-net,代码行数:45,代码来源:SleepingWaitStrategy.cs


示例9: WaitUntil

 public void WaitUntil(Func<bool> test)
 {
     SpinWait sw = new SpinWait();
     int count = 0;
     do
     {
         sw.SpinOnce();
         if (test())
             return;
     } while (!sw.NextSpinWillYield || ++count < 4);
     int? effect = null;
     try
     {
         try {} finally
         {
             effect = Interlocked.Increment(ref _lockers);
         }
         lock (this)
         {
             while (!test())
                 Monitor.Wait(this);
         }
     }
     finally
     {
         if (effect.HasValue)
             Interlocked.Decrement(ref _lockers);
     }
 }
开发者ID:wizardbeard,项目名称:Shielded,代码行数:29,代码来源:StampLocker.cs


示例10: MeasureThroughput

        public void MeasureThroughput()
        {
            const int sendMessageCount = 2000000;

            var senderTransport = CreateAndStartZmqTransport("Abc.Testing.Sender");

            var receivedMessageCount = 0;
            var receiverTransport = CreateAndStartZmqTransport("Abc.Testing.Receiver", _ => ++receivedMessageCount);
            var receivers = new[] { new Peer(receiverTransport.PeerId, receiverTransport.InboundEndPoint) };

            var transportMessage = new FakeCommand(42).ToTransportMessage();
            senderTransport.Send(transportMessage, receivers);

            var spinWait = new SpinWait();
            while (receivedMessageCount != 1)
                spinWait.SpinOnce();

            using (Measure.Throughput(sendMessageCount))
            {
                for (var i = 0; i < sendMessageCount; ++i)
                {
                    senderTransport.Send(transportMessage, receivers);
                }

                while (receivedMessageCount != sendMessageCount + 1)
                    spinWait.SpinOnce();
            }

            senderTransport.Stop();
            receiverTransport.Stop();
        }
开发者ID:MarouenK,项目名称:Zebus,代码行数:31,代码来源:ZmqTransportPerformanceTests.cs


示例11: TryEnterLock

        //SpinWait 每20次会有一次系统时间片切换
        //清理数据(挂的时候数据一致性是问题,全部删掉)
        //然后相当于获取锁往下执行
        //测试发现Count=10w时,wait时间为5s
        private void TryEnterLock()
        {
            SpinWait wait = new SpinWait();
            int head = *_head;
            int tail = *_tail;
            int count = 0;

            while (Interlocked.CompareExchange(ref *_lck, 1, 0) != 0)
            {
                wait.SpinOnce();

                count++;
                if (head != *_head || tail != *_tail)
                {
                    head = *_head;
                    tail = *_tail;
                    count = 0;
                }

                if (count > 100000)
                {
                    Console.WriteLine("ClearData");
                    _ms.ClearData();
                    break;
                }
            }
        }
开发者ID:huoxudong125,项目名称:HQF.Tutorial.MMF,代码行数:31,代码来源:MMFMessageQueue.cs


示例12: Enter

        public void Enter()
        {
            //如果调用线程已拥有锁,递增递归计数并返回
            Int32 threadId = Thread.CurrentThread.ManagedThreadId;
            if (threadId == m_owningThreadId) { m_recursion++; return; }

            //调用线程不拥有锁,尝试获取它
            SpinWait spinwait = new SpinWait();
            for (Int32 spincount = 0; spincount < m_spincount; spincount++)
            {
                //如果锁可以自由使用,这个线程就获得它:设置一些状态并返回
                if (Interlocked.CompareExchange(ref m_waiters, 1, 0) == 0) goto GotLock;

                //Black magic:给其它线程运行的机会,希望锁会释放。
                spinwait.SpinOnce();
            }

            //自旋(Spinning)结束,锁仍然没有获得,再试一次
            if (Interlocked.Increment(ref m_waiters) > 1)
            {
                //其它线程阻塞,这个线程也必须阻塞
                m_waiterlock.WaitOne();//等待锁:性能损失
                //等这个线程醒来时,它拥有锁:设置一些状态并返回。
            }

            GotLock:
            //一个线程拥有锁时,我们记录它的ID,并
            //指出线程拥有锁一次
            m_owningThreadId = threadId; m_recursion = 1;
        }
开发者ID:twfx7758,项目名称:LearnDemo,代码行数:30,代码来源:AnthorHybridLock.cs


示例13: InternalSend

        protected void InternalSend(ISocketSession session, IList<ArraySegment<byte>> segments)
        {
            if (!session.CanSend())
                return;

            if (InternalTrySend(session, segments))
                return;

            var sendTimeOut = m_SendTimeOut;

            //Don't retry, timeout directly
            if (sendTimeOut < 0)
            {
                throw new TimeoutException("The sending attempt timed out");
            }

            var timeOutTime = sendTimeOut > 0 ? DateTime.Now.AddMilliseconds(sendTimeOut) : DateTime.Now;

            var spinWait = new SpinWait();

            while (session.CanSend())
            {
                spinWait.SpinOnce();

                if (InternalTrySend(session, segments))
                    return;

                //If sendTimeOut = 0, don't have timeout check
                if (sendTimeOut > 0 && DateTime.Now >= timeOutTime)
                {
                    throw new TimeoutException("The sending attempt timed out");
                }
            }
        }
开发者ID:rucila,项目名称:SuperSocket,代码行数:34,代码来源:DefaultProtoSender.cs


示例14: Wait

        /// <summary>
        /// Wait Event State to Set 
        /// </summary>
        public void Wait() {
            if(IsDebugEnabled)
                log.Debug("Wait event state to SET...");

            var spinWait = new System.Threading.SpinWait();
            var spinCount = 0;

            while(_state == UN_SET) {
                if(spinCount++ < SpinCount) {
                    spinWait.SpinOnce();

                    if(_eventObj == null) {
                        var mre = new ManualResetEvent(_state == SET);

                        if(Interlocked.CompareExchange(ref _eventObj, mre, null) != null) {
                            // If someone set the flag before seeing the new event object, we must ensure it's been set.
                            if(_state == SET)
                                _eventObj.Set();
                                // Lost the race w/ another thread. Just use its event.
                            else
                                mre.Close();
                        }
                        if(_eventObj != null)
                            _eventObj.WaitOne();
                    }
                }
            }
        }
开发者ID:debop,项目名称:NFramework,代码行数:31,代码来源:ThinEvent.cs


示例15: StartNext

 public void StartNext(CompletionLink next) {
    var spinner = new SpinWait();
    while (!current._RestartWith(next)) {
       spinner.SpinOnce();
    }
    next._Start();
    current = next;
 }
开发者ID:ItzWarty,项目名称:the-dargon-project,代码行数:8,代码来源:CompletionLink.cs


示例16: WaitForStatus

		protected void WaitForStatus()
		{
			if (GetIsCompleted())
				return;

			SpinWait wait = new SpinWait();
			while (!GetIsCompleted())
				wait.SpinOnce();
		}
开发者ID:ermau,项目名称:WinRT.NET,代码行数:9,代码来源:MockAsyncBase.cs


示例17: Wait

        public void Wait()
        {
            SpinWait wait = new SpinWait();

            wait.SpinOnce();

            while (Count > 0)
                Thread.Sleep(1);
        }
开发者ID:ZhenghaiYe,项目名称:iveely,代码行数:9,代码来源:Countdown.cs


示例18: UpgradeToWrite

        /// <summary>
        /// read lock must be aquired prior to calling this!!! we do not check it !!!!
        /// </summary>
        public void UpgradeToWrite()
        {
            var w = new SpinWait();

            while (1 != Interlocked.CompareExchange(ref _lock, _writerLock + 1, 1))
            {
                w.SpinOnce();
            }
        }
开发者ID:yonglehou,项目名称:ReaderWriterLockTiny,代码行数:12,代码来源:ReaderWriterLockTiny.cs


示例19: EnterWriteLock

        public void EnterWriteLock()
        {
            var w = new SpinWait();

            while (0 != Interlocked.CompareExchange(ref _lock, _writerLock, 0))
            {
                w.SpinOnce();
            }
        }
开发者ID:yonglehou,项目名称:ReaderWriterLockTiny,代码行数:9,代码来源:ReaderWriterLockTiny.cs


示例20: AddParticipants

 public long AddParticipants(int participantCount)
 {
     this.ThrowIfDisposed();
     if (participantCount < 1)
     {
         throw new ArgumentOutOfRangeException("participantCount", participantCount, SR.GetString("Barrier_AddParticipants_NonPositive_ArgumentOutOfRange"));
     }
     if (participantCount > 0x7fff)
     {
         throw new ArgumentOutOfRangeException("participantCount", SR.GetString("Barrier_AddParticipants_Overflow_ArgumentOutOfRange"));
     }
     if ((this.m_actionCallerID != 0) && (Thread.CurrentThread.ManagedThreadId == this.m_actionCallerID))
     {
         throw new InvalidOperationException(SR.GetString("Barrier_InvalidOperation_CalledFromPHA"));
     }
     SpinWait wait = new SpinWait();
     long num = 0L;
     while (true)
     {
         int num3;
         int num4;
         bool flag;
         int currentTotalCount = this.m_currentTotalCount;
         this.GetCurrentTotal(currentTotalCount, out num4, out num3, out flag);
         if ((participantCount + num3) > 0x7fff)
         {
             throw new ArgumentOutOfRangeException("participantCount", SR.GetString("Barrier_AddParticipants_Overflow_ArgumentOutOfRange"));
         }
         if (this.SetCurrentTotal(currentTotalCount, num4, num3 + participantCount, flag))
         {
             long currentPhase = this.m_currentPhase;
             num = (flag != ((currentPhase % 2L) == 0L)) ? (currentPhase + 1L) : currentPhase;
             if (num != currentPhase)
             {
                 if (flag)
                 {
                     this.m_oddEvent.Wait();
                     return num;
                 }
                 this.m_evenEvent.Wait();
                 return num;
             }
             if (flag && this.m_evenEvent.IsSet)
             {
                 this.m_evenEvent.Reset();
                 return num;
             }
             if (!flag && this.m_oddEvent.IsSet)
             {
                 this.m_oddEvent.Reset();
             }
             return num;
         }
         wait.SpinOnce();
     }
 }
开发者ID:pritesh-mandowara-sp,项目名称:DecompliedDotNetLibraries,代码行数:56,代码来源:Barrier.cs



注:本文中的System.Threading.SpinWait类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# Threading.StackCrawlMark类代码示例发布时间:2022-05-26
下一篇:
C# Threading.SemaphoreSlim类代码示例发布时间:2022-05-26
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap