相关疑难解决方法(0)

SwitchToThread/Thread.Yield vs. Thread.Sleep(0)vs. Thead.Sleep(1)

我正在尝试编写最终的"Yield"方法,以将当前时间片提供给其他线程.到目前为止,我发现有几种不同的方法可以使线程产生分配的时间片.我只是想确保我正确地解释它们,因为文档不是很清楚.因此,从我在stackoverflow,MSDN和各种博客文章中看到的内容,存在以下选项,它们都有不同的优点/缺点:

SwitchToThread[win32]/Thread.Yield[.NET 4 Beta 1]:产生同一处理器上的任何线程

  • 优势:大约快两倍 Thread.Sleep(0)
  • 缺点:仅产生同一处理器上的线程

Thread.Sleep(0):在任何处理器上产生任何具有相同或更高优先级的线程

  • 优点:比快 Thread.Sleep(1)
  • 缺点:仅产生相同或更高优先级的线程

Thread.Sleep(1):屈服于任何处理器上的任何线程

  • 优点:产生任何处理器上的任何线程
  • 缺点:最慢选项(Thread.Sleep(1)如果 不使用timeBeginPeriod/ timeEndPeriod[win32],通常会将线程暂停约15ms )

怎么样Thread.SpinWait?可以用它来产生线程的时间片吗?如果没有,它用于什么?

我还有其他一些我错过或错误解释的东西.如果你能纠正/增加我的理解,我将不胜感激.

这就是我的Yield方法到目前为止的样子:

public static class Thread
{
    [DllImport("kernel32.dll")]
    static extern bool SwitchToThread();

    [DllImport("winmm.dll")]
    internal static extern uint timeBeginPeriod(uint period);

    [DllImport("winmm.dll")]
    internal static extern uint timeEndPeriod(uint period);

    /// <summary>  yields time slice of current thread to specified target threads </summary>
    public static void YieldTo(ThreadYieldTarget threadYieldTarget)
    {
        switch (threadYieldTarget) { …
Run Code Online (Sandbox Code Playgroud)

.net concurrency multithreading

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

睡眠(0)和暂停指令的繁忙循环有什么不同?

我想在我的应用程序中等待一个应该立即发生的事件,所以我不想让我的线程等待并稍后唤醒它。我想知道使用Sleep(0)和硬件暂停指令有什么区别。

我看不到以下程序的 CPU 利用率有任何差异。我的问题不是关于省电的考虑。

#include <iostream>
using namespace std;
#include <windows.h>

bool t = false;
int main() {
       while(t == false)
       {
              __asm { pause } ;
              //Sleep(0);
       }
}
Run Code Online (Sandbox Code Playgroud)

c++ x86 hardware-interface busy-loop lockless

6
推荐指数
2
解决办法
1925
查看次数

Git如何从UNC路径获取更改?

我在Windows PC上的共享文件夹中有一个Git存储库,我使用UNC路径访问该文件夹,例如

git clone //server/share/MyRepo.git
Run Code Online (Sandbox Code Playgroud)

当我从家中通过VPN获取此存储库中的更改时,需要长时间git-upload-pack.exe才能运行.我意识到没有涉及服务器(如此),我的本地PC正在运行所有可执行文件.

这个名字git-upload-pack.exe告诉我,我的本地PC正在从远程文件共享中读取文件,以便将它们上传到某处,但这本身就是自己的,这没有任何意义.这反过来又让我觉得它fetch远没有达到预期的效果.这就像本地机器正在做所有工作来减少要传输的数据,但要做到这一点,它必须传输所有数据.

任何人都可以阐明它是如何工作的吗?没有通过SSH或远程端的任何东西运行真正的Git服务器,或者是不必要地来回传输文件,性能是否尽可能好?

windows git

5
推荐指数
1
解决办法
922
查看次数