无法获取锁(非自旋)的线程会发生什么?它进入 BLOCKED 状态。它如何再次执行?
Lock lck = new ReentrantLock();
lck.lock()
try
{
}
finally
{
lck.unlock();
}
Run Code Online (Sandbox Code Playgroud) 我正在为我的大学做一项与医学用图像重建算法相关的研究.
我陷入了长达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#来控制命令行应用程序背景,可以在此处下载: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
问题类似于以下两个问题.
但我仍然无法完全理解它.
到目前为止,我认为以下代码中的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说如果还没有输入,则此方法会阻塞.
什么" 没有输入可用 "是什么意思?
谢谢.
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) 一个类似但不同的问题:
我有一个生成字符串的 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) 我正在用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个线程调用它.此时所有线程都应该继续运行.线程池的一个要求是它不应该死锁,因为池中的线程数太少.
我必须读取来自网络的一些数据,然后将其插入到 MongoDB 中。所有这些都是使用 Python 脚本完成的。有什么方法可以从 Python 对 Mongo 进行非阻塞插入,这样我就可以在 Mongo 服务器处理插入的同时继续处理来自网络的数据?
我的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()方法时没有区别.
我阻止了事件循环吗?我应该在这里使用不同的方法吗?
由于此功能是相对较新的(mongo 3.6),因此我发现了很少的Java示例。我的问题:1.观察变更流的最佳实践是什么?2.观看流是否一定是阻塞呼叫?(这意味着每个集合都不太需要线程)这是我遇到的示例:
http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
阻塞调用是:collection.watch()。forEach(printBlock);
谢谢,Rotem。
blocking ×10
c++ ×2
java ×2
mongodb ×2
nonblocking ×2
python ×2
sockets ×2
asynchronous ×1
c ×1
c# ×1
c++11 ×1
caching ×1
event-loop ×1
inputstream ×1
java-io ×1
linux ×1
locking ×1
monitor ×1
optimization ×1
qeventloop ×1
qt ×1
simd ×1
stream ×1
threadpool ×1
watch ×1
windows ×1
winsock2 ×1