我正在使用非常标准的Threading.Event:主线程在一个循环中运行:
event.wait(60)
其他阻止请求,直到回复可用,然后启动:
event.set()
我希望主线程选择40秒,但事实并非如此.从Python 2.7源代码Lib/threading.py:
# Balancing act:  We can't afford a pure busy loop, so we
# have to sleep; but if we sleep the whole timeout time,
# we'll be unresponsive.  The scheme here sleeps very
# little at first, longer as time goes on, but never longer
# than 20 times per second (or the timeout time remaining).
endtime = _time() + timeout
delay = 0.0005 # 500 us -> initial delay of 1 ms
while …我想在我的应用程序中等待一个应该立即发生的事件,所以我不想让我的线程等待并稍后唤醒它。我想知道使用Sleep(0)和硬件暂停指令有什么区别。
我看不到以下程序的 CPU 利用率有任何差异。我的问题不是关于省电的考虑。
#include <iostream>
using namespace std;
#include <windows.h>
bool t = false;
int main() {
       while(t == false)
       {
              __asm { pause } ;
              //Sleep(0);
       }
}
为什么写下面的代码被认为是不好的做法有什么原因?
  while (someList.isEmpty()) {
    try {
      Thread.currentThread().sleep(100);
    }
    catch (Exception e) {}
  }
  // Do something to the list as soon as some thread adds an element to it.
对我来说,选择一个任意值进行睡眠并不是一种好的做法,我会BlockingQueue在这种情况下使用a ,但我想知道为什么不应该写这样的代码有多个原因.
对于相同的情况,自旋等待、自旋循环和忙自旋是否是不同的名称?
我阅读了不同的线程,它们似乎都与一个“忙”检查资源可用性的循环有关。
我有一个应用程序,它设置了FileSystemWatcher.它应该无限期地运行.
让它在空闲循环中运行的最佳方法是什么?
我现在正在做
FileSystemWatcher watch = ... //setup the watcher
watch.EnableRaisingEvents = true;
while (true) 
{
    Thread.Sleep(int.MaxValue);
}
这似乎工作(即捕获事件,并没有在繁忙的循环中使用核心).
还有其他成语吗?这种方法有什么问题吗?
我正在寻找一种方法来摆脱闲置代码中的主机线程中的繁忙等待(不复制该代码,它仅表示我的问题,它具有许多基本错误):
cudaStream_t steams[S_N];
for (int i = 0; i < S_N; i++) {
    cudaStreamCreate(streams[i]);
}
int sid = 0;
for (int d = 0; d < DATA_SIZE; d+=DATA_STEP) {
     while (true) {
         if (cudaStreamQuery(streams[sid])) == cudaSuccess) { //BUSY WAITING !!!!
             cudaMemcpyAssync(d_data, h_data + d, DATA_STEP, cudaMemcpyHostToDevice, streams[sid]);
             kernel<<<gridDim, blockDim, smSize streams[sid]>>>(d_data, DATA_STEP);
             break;
         }
         sid = ++sid % S_N;
     }
}
有没有一种方法可以使主机线程空闲并以某种方式等待某个流完成,然后准备并运行另一个流?
编辑:我在代码中添加了while(true),以强调忙等待。现在,我执行所有流,并检查其中哪个流完成以运行另一个新流。cudaStreamSynchronize等待特定的流完成,但是我想等待首先完成工作的任何流。
EDIT2:我摆脱了以休闲方式的繁忙等待:
cudaStream_t steams[S_N];
for (int i = 0; i < S_N; i++) {
    cudaStreamCreate(streams[i]);
} …我正在使用boost实现一些asio操作,遇到一个接口问题,在初始化时没有收到“处理程序”,但是之后,
这迫使我编写一个“忙”循环,我想做的是即使没有至少一个处理程序也要运行io_service,这可能吗?如何处理呢?等待服务的处理程序吗?这是我的代码。
    /** : */
    void                Run             () { while(true) {m_srv.run(); Sleep(1);} } // once 1 handler is inside service, thread will not be in busy loop
private: // members:
    io_service  m_srv;
有什么建议么?谢谢
这是代码问题:(m_drv是操作boost :: thread(io_service :: run ..)的任务)
class App : public Base::Application
{
public:
    /** : */
    App(char* name, char* id) : Application(name, id), m_drv("NetTask"), m_worker("Worker"), m_acceptor(m_worker, Drv(), &OnAccept, 4567)
    {
        m_acceptor.Accept(Drv());
    }
    /** : */
    inline DriverImp& Drv() { return static_cast<DriverImp&>(m_drv.Imp());}
    /** : */
    inline Reactor& Worker() …busy-loop ×7
c++ ×2
.net ×1
boost ×1
boost-asio ×1
busy-waiting ×1
c# ×1
concurrency ×1
cuda ×1
cuda-streams ×1
events ×1
java ×1
lockless ×1
python ×1
x86 ×1