标签: blocking

获取锁失败的线程会发生什么?

无法获取锁(非自旋)的线程会发生什么?它进入 BLOCKED 状态。它如何再次执行?

Lock lck = new ReentrantLock();
lck.lock()
try
{
}
finally
{
   lck.unlock();
}
Run Code Online (Sandbox Code Playgroud)

java locking monitor blocking

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

在医学图像重建实施中改善局部性并减少缓存污染

我正在为我的大学做一项与医学用图像重建算法相关的研究.

我陷入了长达3周的困境,我需要提高以下代码的性能:

for (lor=lor0[mypid]; lor <= lor1[mypid]; lor++)
{
  LOR_X = P.symmLOR[lor].x;
  LOR_Y = P.symmLOR[lor].y;
  LOR_XY = P.symmLOR[lor].xy;
  lor_z = P.symmLOR[lor].z;
  LOR_Z_X = P.symmLOR[lor_z].x;
  LOR_Z_Y = P.symmLOR[lor_z].y;
  LOR_Z_XY = P.symmLOR[lor_z].xy;  

  s0 = P.a2r[lor];
  s1 = P.a2r[lor+1];

  for (s=s0; s < s1; s++)
  {
    pixel     = P.a2b[s];
    v         = P.a2p[s]; 

    b[lor]    += v * x[pixel];

    p          = P.symm_Xpixel[pixel];
    b[LOR_X]  += v * x[p];

    p          = P.symm_Ypixel[pixel];
    b[LOR_Y]  += v * x[p];

    p          = P.symm_XYpixel[pixel];
    b[LOR_XY] += v * x[p];


    // do …
Run Code Online (Sandbox Code Playgroud)

c optimization caching simd blocking

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

异步读取操作的异常已在StandardOutput流上进行

我正在尝试使用C#来控制命令行应用程序背景,可以在此处下载:http://www.ti.com/litv/zip/spmc015b

这是一个电机电压控制的应用程序,当我进入应用程序,如"b.exe -c 1",控制台似乎是一种阻止模型.此应用程序中的每个命令都以"#"符号开头.看这里的照片:

http://i46.tinypic.com/zx5edv.jpg

我正在尝试做的是,使用StandardInput.WriteLine("stat vout"); 测量电压.这将向控制台后台发送"stat vout"命令,理想情况下返回电压值.在这张图片中,它返回了一些帮助提示.Duing一直这样,它仍处于阻塞模式.

我想用StandardOutput.ReadLine()获取返回消息; 但失败了.如果ReadToEnd()然后我的程序被冻结,因为这个应用程序永远不会返回标准控制台,这是阻止.

当我尝试BeginOutputReadLine(); OutputDataReceived事件可以真正从控制台获取消息返回,就像在"stat [vout | vbus | fault"的图片中一样.但它限制在我的单线程程序中.

我目前的情况是,我在WinForms中使用System.Timers.Timers,并且每秒都会发送一个"stat vout2"命令来读取电压,并希望获得返回值.

但是,System.Timers.Timers是异步的,所以当我在这个Timers线程中调用BeginOutputReadLine()时,它会提示"已经在流上启动了异步读取操作".与此同时,正如我在上面演示的那样,我不能使用像ReadLine()这样的同步方法来获取值.

那我现在该怎么办?我真的需要在多线程模式下运行这个命令行应用程序.

非常感谢,祝大家周末愉快.

--UPDATE于4月28日19:18 CST以下是相关的源代码:

其中一个WinFroms按钮将Start()SystemClock类,然后每秒执行Timing.Measuring().根据SystemClock,TimingController类将在一秒钟内同时调用GetVoltage()和GetCurrent()来测量电压和电流.

在Measuring Class,StandardInput.WriteLine("stat vout2"); 从控制台应用程序和StandardInput.WriteLine("stat cur")获取电压; 获得当前.由于StandardOutput不起作用,因此它们都使用BeginOutputReadLine()来获取结果.

我使用isOutputObtained标志来指示是否返回数据.每次阅读完成后,我都会调用CancelOutputRead(); 取消异步读取.

但它仍然给我错误"异步读取操作已经在StandardOutput流上进行"

public class SystemClock
{
    TimingController Timing = new TimingController();
    private Timer TimerSystemClock;

    public SystemClock()
    {
        TimerSystemClock = new Timer();
        TimerSystemClock.Interval = 1000;
        TimerSystemClock.AutoReset = true;
        TimerSystemClock.Elapsed += new ElapsedEventHandler(TimerSystemClock_Elapsed);
        TimerSystemClock.Enabled = false;
        Timing.ClockInstance = this;
    }

    public void Start()
    {
        TimerSystemClock.Enabled = …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous blocking redirectstandardoutput

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

FileInputStream.read()什么时候阻止?

问题类似于以下两个问题.

但我仍然无法完全理解它.

到目前为止,我认为以下代码中的read()方法将因空文件'test.txt'而阻塞.

FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");
Run Code Online (Sandbox Code Playgroud)

实际上它会打印-1,我想知道为什么.

javadoc说如果还没有输入,则此方法会阻塞.

什么" 没有输入可用 "是什么意思?

谢谢.

java inputstream blocking fileinputstream java-io

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

Winsock2 listen() 是如何阻塞的?

MSDN说:Listen() 是一个阻塞调用。我在其中使用过 listen() 的函数的代码片段如下所示:

sockaddr_in addr    = {0};
int     addrlen = sizeof(addr);
SOCKET  sock_listen;

if(-1 == (sock_listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
{
    cout<<"error";
}   

addr.sin_family = AF_INET;
/* Network byte ordered address for loopback */
addr.sin_addr.s_addr= inet_addr("127.0.0.1");
/* Let service provider assign a unique port from dynamic client port range */  
addr.sin_port   = 0;                        

if(-1 == bind(sock_listen, (const sockaddr *)&addr, addrlen))       
{
    CloseHandle((HANDLE)sock_listen_fd);
    cout<<"error";
}

if(-1 == getsockname(sock_listen, (sockaddr *)&addr, &addrlen))
{     
    CloseHandle((HANDLE)sock_listen);
    cout<<"error";
}

u_long mode = 0; …
Run Code Online (Sandbox Code Playgroud)

sockets linux windows blocking winsock2

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

如何在python中实现非阻塞套接字服务器

一个类似但不同的问题:

我有一个生成字符串的 IRC 客户端。这个 IRC 客户端使用一个钩子来调用一个方法 (somone_said) 每当有人说的话。我想通过套接字将此字符串发送到我的 Flash 客户端。

我有一个在 flash 中工作的客户端和一个在 python 中的服务器,但问题是它阻塞:1)在侦听客户端连接时 2)在等待生成下一条消息时

这会阻止 IRC 客户端响应其他输入。

我想我需要在一个单独的线程中创建我的套接字,但这又产生了三个问题。1)我的someone_said事件驱动方法如何访问套接字2)如果有人在没有服务器客户端连接(在侦听时)或客户端关闭连接时说了些什么怎么办。3)如何检查线程是否处于活动状态,如果没有打开一个新线程?

我的阻塞服务器代码是这样的:

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 7001              # Arbitrary non-privileged port
s = None

def startListening():
    print "starting to listen"

    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                  socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
        af, socktype, proto, canonname, sa = res
        try:
            s = socket.socket(af, socktype, proto)
        except socket.error as …
Run Code Online (Sandbox Code Playgroud)

python sockets multithreading nonblocking blocking

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

有没有办法找出线程是否被阻止?

我正在用C++编写一个线程池类,它接收要并行执行的任务.如果可能的话,我希望所有核心都忙,但有时一些线程处于空闲状态,因为它们被阻塞了一段时间以进行同步.当发生这种情况时,我想启动一个新线程,以便总有大约与cpu核心一样多的线程清醒.为此,我需要一种方法来确定某个线程是醒着还是睡眠(被阻塞).我怎么能找到这个?

我更喜欢使用C++ 11标准库或提升以实现可移植性.但如果有必要,我也会使用WinAPI.我在Windows 7上使用Visual Studio 2012.但实际上,我希望有一种可移植的方式来实现这一点.

优选地,该线程池应该能够掌握类似的情况

MyThreadPool pool;
for ( int i = 0; i < 100; ++i )
    pool.addTask( &block_until_this_function_has_been_called_a_hundred_times );
pool.join(); // waits until all tasks have been dispatched.
Run Code Online (Sandbox Code Playgroud)

函数block_until_this_function_has_been_called_a_hundred_times()阻塞,直到100个线程调用它.此时所有线程都应该继续运行.线程池的一个要求是它不应该死锁,因为池中的线程数太少.

c++ multithreading blocking threadpool c++11

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

是否可以从 Python 对 Mongo 进行非阻塞批量插入?

我必须读取来自网络的一些数据,然后将其插入到 MongoDB 中。所有这些都是使用 Python 脚本完成的。有什么方法可以从 Python 对 Mongo 进行非阻塞插入,这样我就可以在 Mongo 服务器处理插入的同时继续处理来自网络的数据?

python nonblocking blocking mongodb

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

在插槽中调用QDialog :: exec会阻塞主事件循环吗?

我的Qt应用程序的主窗口是一个普通的QMainWindow子类.在那个窗口我有几个按钮; 每个clicked插槽的信号都连接自己的插槽,每个插槽创建一个不同的插槽QDialog:

void onButtonA_clicked()
{
    MyADialog* dialog = new MyADialog(this);
    dialog->exec();
    delete dialog;
}
Run Code Online (Sandbox Code Playgroud)

我一直在读这篇文章:https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loop和作者说

你永远不应该阻止事件循环

哪个让我担心; exec是一个阻塞函数,所以根据他所说的(他的例子Worker::doWork做了很多工作,需要一些时间来完成)我的代码阻止了事件循环,但我没有注意到任何暗示这一点; 相反,主窗口似乎表现正常,并且当我更改代码以使用该show()方法时没有区别.

我阻止了事件循环吗?我应该在这里使用不同的方法吗?

c++ qt event-loop blocking qeventloop

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

mongodb更改流java

由于此功能是相对较新的(mongo 3.6),因此我发现了很少的Java示例。我的问题:1.观察变更流的最佳实践是什么?2.观看流是否一定是阻塞呼叫?(这意味着每个集合都不太需要线程)这是我遇到的示例:

http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/

阻塞调用是:collection.watch()。forEach(printBlock);

谢谢,Rotem。

stream watch blocking mongodb

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