Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

10
C ++ 0x没有信号量?如何同步线程?
C ++ 0x会没有信号量是真的吗?关于信号量的使用,在堆栈溢出方面已经存在一些问题。我一直使用它们(posix信号量)让一个线程在另一个线程中等待某个事件: void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... } 如果我要用互斥锁来做到这一点: void thread0(...) { doSomething0(); event1.lock(); event1.unlock(); ... } void thread1(...) { event1.lock(); doSomethingth1(); event1.unlock(); ... } 问题:这很丑陋,不能保证thread1首先锁定互斥锁(鉴于同一线程应该锁定和解锁互斥锁,因此您也不能在thread0和thread1启动之前锁定event1)。 因此,由于boost也没有信号量,实现以上目标的最简单方法是什么?


8
SynchronizationContext做什么?
在《 Programming C#》一书中,有一些有关SynchronizationContext以下示例代码: SynchronizationContext originalContext = SynchronizationContext.Current; ThreadPool.QueueUserWorkItem(delegate { string text = File.ReadAllText(@"c:\temp\log.txt"); originalContext.Post(delegate { myTextBox.Text = text; }, null); }); 我是主题初学者,所以请详细回答。首先,我不知道上下文是什么意思,程序保存在中originalContext什么?当该Post方法被触发时,UI线程将做什么? 如果我问一些愚蠢的事情,请指正我,谢谢! 编辑:例如,如果我只是myTextBox.Text = text;在方法中写什么,有什么区别?
135 c#  .net  multithreading 

3
了解事件循环
我正在考虑,这是我想到的: 假设我们有这样的代码: console.clear(); console.log("a"); setTimeout(function(){console.log("b");},1000); console.log("c"); setTimeout(function(){console.log("d");},0); 一个请求进入,并且JS引擎逐步开始执行上述代码。前两个呼叫是同步呼叫。但是当涉及到setTimeout方法时,它将成为异步执行。但是JS立即从中返回并继续执行,这称为Non-Blocking或Async。并且它继续在其他等等上工作。 执行结果如下: 交流数据库 因此,基本上第二个setTimeout首先完成,其回调函数比第一个更早执行,这很有意义。 我们在这里谈论单线程应用程序。JS Engine会继续执行此操作,除非它完成第一个请求,否则它将不会转到第二个请求。但好处是它不会等待像setTimeout解析这样的阻塞操作,因此它会更快,因为它接受新的传入请求。 但是我的问题围绕以下几个方面提出: #1:如果我们在谈论单线程应用程序,那么setTimeouts当JS引擎接受更多请求并执行它们时,什么机制会处理?单线程如何继续处理其他请求?setTimeout在其他请求不断进入并被执行的同时,什么起作用。 #2:如果这些setTimeout函数在更多请求传入并正在执行时在后台执行,那么在后台执行异步执行的是什么?我们所说的这个东西叫EventLoop什么? #3:但是不应该将整个方法都放入EventLoop以便执行整个过程并调用回调方法吗?这是我在谈论回调函数时所了解的: function downloadFile(filePath, callback) { blah.downloadFile(filePath); callback(); } 但是在这种情况下,JS引擎如何知道它是否是一个异步函数,以便可以将回调函数放在EventLoop? Perhaps something like theC#中的async`关键字中或某种表明JS引擎将采用的方法的属性是异步方法并应予以相应对待。 #4:但是一篇文章说与我猜测事情可能如何运作完全相反: 事件循环是回调函数的队列。当执行异步函数时,回调函数将被推入队列。在执行异步函数后的代码之前,JavaScript引擎不会开始处理事件循环。 #5:这里有这张图片可能会有所帮助,但是图片中的第一个解释是说问题4中提到的完全相同的内容: 因此,我的问题是要对上述项目进行一些澄清?


3
packaged_task和async有什么区别
在使用C ++ 11的线程模型时,我注意到 std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; }); auto f = task.get_future(); task(2,3); std::cout << f.get() << '\n'; 和 auto f = std::async(std::launch::async, [](int a, int b) { return a + b; }, 2, 3); std::cout << f.get() << '\n'; 似乎做的完全一样。我知道,如果std::async与一起跑步,可能会有很大的不同std::launch::deferred,但是在这种情况下,有没有区别? 这两种方法之间有什么区别,更重要的是,我应该在哪种用例中使用一种而不是另一种?

10
异步与多线程-有区别吗?
异步调用是否总是创建一个新线程?两者有什么区别? 异步调用是否总是创建或使用新线程? 维基百科说: 在计算机编程中,异步事件是独立于主程序流程而发生的事件。异步动作是在非阻塞方案中执行的动作,允许主程序流继续进行处理。 我知道异步调用可以在单线程上完成吗?这怎么可能?

16
Windows线程:_beginthread与_beginthreadex与CreateThread C ++
什么是更好的方式来启动一个线程,_beginthread,_beginthreadx或CreateThread? 我试图确定什么是优势/劣势_beginthread,_beginthreadex和CreateThread。所有这些函数都将线程句柄返回到新创建的线程,我已经知道,当发生错误时(可以通过调用来检查GetLastError),CreateThread提供了一些额外的信息。米使用这些功能? 我正在使用Windows应用程序,因此跨平台兼容性已经成为不可能。 我已经阅读了msdn文档,例如,我什至不明白为什么有人会决定使用_beginthread而不是CreateThread,反之亦然。 干杯! 更新:OK,所有的信息,谢谢,我也看到了在几个地方,我不能打电话WaitForSingleObject(),如果我使用的_beginthread(),但如果我呼吁_endthread()在线程不应该工作?那有什么事
133 c++  c  multithreading  winapi 

6
我应该在Java中使用哪个并发队列实现?
从JavaDocs: 一的ConcurrentLinkedQueue是当许多线程共享访问一个共同的集合一个合适的选择。此队列不允许空元素。 ArrayBlockingQueue是一个经典的“有界缓冲区”,其中固定大小的数组保存由生产者插入并由消费者提取的元素。此类支持可选的公平性策略,用于订购正在等待的生产者和使用者线程 与基于阵列的队列相比,LinkedBlockingQueue通常具有更高的吞吐量,但是在大多数并发应用程序中,可预测的性能较差。 我有两种情况,一种情况要求队列支持一个使用者使用许多生产者(使用它的线程),而另一种情况则相反。 我不知道要使用哪种实现。有人可以解释这些区别是什么吗? 另外,什么是“可选的公平政策” ArrayBlockingQueue?

7
如何在Android的后台线程上运行代码?
我希望一些代码在后台连续运行。我不想在服务中这样做。还有其他办法吗? 我曾尝试Thread在我的班级中调用该类,Activity但我Activity仍然在后台停留一段时间,然后停止。该Thread班也停止工作。 class testThread implements Runnable { @Override public void run() { File file = new File( Environment.getExternalStorageDirectory(), "/BPCLTracker/gpsdata.txt" ); int i = 0; RandomAccessFile in = null; try { in = new RandomAccessFile( file, "rw" ); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch …

6
如何从线程池获取线程ID?
我有一个固定的线程池,我可以将任务提交给该线程池(限制为5个线程)。我如何找出这5个线程中的哪个执行我的任务(例如“ 5个线程中的第3 个线程正在执行此任务”)? ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }



10
C ++ 11中的线程池
相关问题: 关于C ++ 11: C ++ 11:std :: thread池化了吗? 为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时? 关于Boost: C ++ Boost线程重用线程 boost :: thread并创建它们的池! 我如何获得一个线程池以将任务发送到,而不是一遍又一遍地创建和删除它们?这意味着持久线程无需加入即可重新同步。 我有看起来像这样的代码: namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } } int main(int argc, char *argv[]) { …

5
何时在多线程中使用volatile?
如果有两个线程访问全局变量,那么许多教程都说要使变量可变,以防止编译器将变量缓存在寄存器中,从而导致无法正确更新。但是,两个都访问共享变量的线程需要通过互斥锁进行保护,不是吗?但是在那种情况下,在线程锁定和释放互斥锁之间,代码处于关键部分,其中只有一个线程可以访问该变量,在这种情况下,变量不需要是可变的? 因此,多线程程序中volatile的用途/目的是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.