Articles of multithreading

Java ProcessBuilder:结果进程挂起

我一直在尝试使用Java的ProcessBuilder在Linux中启动应该“长期”运行的应用程序。 这个程序运行的方式是启动一个命令(在这种情况下,我启动一个媒体播放应用程序),让它运行,并检查,以确保它没有崩溃。 例如,检查PID是否仍然有效,然后重新启动进程,如果它已经死了。 我现在得到的问题是,PID在系统中保持活动状态,但应用程序的GUI挂起。 我尝试将ProcessBuilder(cmd).start()转换为一个单独的线程,但似乎没有解决任何问题,正如我所希望的那样。 基本上,对于用户来说,程序APPEARS已经崩溃,但是杀死驱动ProcessBuilder.start()进程的Java进程实际上允许创build的进程恢复其正常行为。 这意味着Java应用程序中的某些内容正在干扰生成的进程,但我完全不知道在这一点上是什么。 (因此,为什么我试图把它分成另一个线程,这似乎没有解决任何问题) 如果有人有任何意见或build议,请让我知道,因为我不能为了我的生活而想到如何解决这个问题。 编辑:我不关心从stream程创build的I / Ostream,因此没有采取任何措施来处理 – 这可能会导致stream程本身的挂起?

检查线程是否完成的正确方法?

我正在使用_beginthread在我的应用程序multithreading,现在等待,直到所有的线程完成我有全局布尔值设置为true每个线程完成,所以我在一个while循环,直到那时。 必须有一个更干净的方式来做到这一点? 谢谢

将parameter passing给_beginthreadex

我正在尝试使用_beginthreadex进行一些基本的并行化,并按照我给出的示例传递参数,但是它不起作用。 有任何想法吗? #include <iostream> #include <process.h> void MyThread(void *data) { std::cout << "Hello World!"; } int main() { _beginthreadex(NULL, 0, MyThread, NULL, 0, NULL); while(true); } 编辑: 为什么不传递NULL作为参数工作? (由于该函数无论如何不采取任何论点?) 作为参数列表传递NULL与_beginthread工作正常。

导致故障转储的Java错误的解决方法

我开发的程序偶尔会因为这个bug而崩溃: http : //bugs.java.com/bugdatabase/view_bug.do?bug_id=8029516 。 不幸的是,这个错误还没有被Oracle解决,并且错误报告说没有已知的解决方法。 我试图通过在KeyWatcher线程中调用.register(sWatchService,eventKinds)来修改bug报告中的示例代码,而将所有挂起的注册请求添加到我在KeyWatcher线程中循环的列表中,但仍然崩溃。 我猜这跟sWatchService上的同步效果一样(就像bug报告的提交者一样)。 你能想办法解决这个问题吗?

线程启动时的竞态条件?

我正在运行下面的代码来启动我的线程,但是它们不是按照预期启动的。 出于某种原因,一些线程以相同的对象开始(有些甚至不启动)。 如果我尝试debugging,他们开始就好(通过点击F10添加额外的延迟来逐步通过代码)。 这些是我的表单应用程序中的function: private void startWorkerThreads() { int numThreads = config.getAllItems().Count; int i = 0; foreach (ConfigurationItem tmpItem in config.getAllItems()) { i++; var t = new Thread(() => WorkerThread(tmpItem, i)); t.Start(); //return t; } } private void WorkerThread(ConfigurationItem cfgItem, int mul) { for (int i = 0; i < 100; i++) { Thread.Sleep(10*mul); } […]

跨平台等同于Windows事件

我试图移植一些Windows代码到Linux,理想情况下通过独立于平台的库(例如boost),但是我不知道如何移植这一点的事件代码。 代码位包含两个线程(让我们称之为A和B)。 A想要做的事情只有B可以,所以它发送一个消息,然后等待B说完成。 在Windows中,这看起来像这样: void foo();//thread a calls this void bar(HANDLE evt); void foo() { HANDLE evt = CreateEvent(0,FALSE,FALSE,0); bCall(boost::bind(&bar, evt)); WaitForSingleObject(evt,INFINITE); CloseHandle(evt); } void bar(HANDLE evt) { doSomething(); SetEvent(evt); } 我查看了boost :: thread库,但似乎没有任何这样做,closures我可以看到的是boost :: condition_variable,但它似乎意味着与一个互斥的结合,这是不是这里。

有效的线程数

我想优化我的应用程序线程数量。 几乎所有的CPU都有相同的IO值。 在系统中没有其他应用程序运行时,线程的有效数量是多less。 我想要Windows和JVM下的答案。

如何正确地终止一个dll内的挂起的线程?

大家好, 我有一个包含错误的第三方库。 当我调用一个函数时,它可能会挂起。 库函数在dll中调用。 我决定把呼叫转移到线程中,等待一段时间。 如果线程完成,然后确定。 如果不是 – 我应该终止它的强制性。 这里简单的例子: unsigned Counter = 0; void f() { HANDLE hThread; unsigned threadID; // Create the second thread. hThread = (HANDLE)_beginthreadex( NULL, 0, DoSomething, NULL, 0, &threadID ); if (WAIT_TIMEOUT == WaitForSingleObject( hThread, 5000 )) { TerminateThread(hThread, 1); wcout << L"Process is Timed Out"; } else { […]

如何使方法运行在“后台”(线程?)

我目前有一些代码循环通过文本文件寻找一个特定的短语。 但是,当这个方法运行时,整个应用程序将被locking。 我假设,因为它循环,这是我想要的。 我希望这发生在后台,所以正常的方法和用户与应用程序的交互仍然可以完成。 这怎么做/改进? private void CheckLog() { while (true) { // lets get a break Thread.Sleep(5000); if (!File.Exists("Command.bat")) { continue; } using (StreamReader sr = File.OpenText("Command.bat")) { string s = ""; while ((s = sr.ReadLine()) != null) { if (s.Contains("mp4:production/")) { // output it MessageBox.Show(s); } } } } }

C ++multithreading执行速度减慢

我在写一个multithreading的c ++应用程序。 当线程A有一个非常昂贵的计算操作来执行时,会减慢线程B,C和D.如何防止这种情况?