我正在尝试编写最终的"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) 我想在我的应用程序中等待一个应该立即发生的事件,所以我不想让我的线程等待并稍后唤醒它。我想知道使用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) 我在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服务器,或者是不必要地来回传输文件,性能是否尽可能好?