Articles of multithreading

抢先线索与非抢先线索

有人可以解释抢先线程模型和非抢先线程模型之间的区别吗? 根据我的理解: 非抢占式线程模型:线程一旦启动就不能停止,或者控制不能被其他线程转移,直到线程完成其任务。 抢占式线程模型:运行时被允许介入并随时从一个线程控制到另一个线程。 优先级较高的线程优先于较低优先级的线程。 有人可以请: 说明理解是否正确。 解释两种模式的优缺点。 什么时候使用真正有用的例子。 如果我在Linux(system v或Pthread)中创build一个线程而不提及任何选项(有没有?),默认情况下使用的线程模型是抢先线程模型?

Java I / O与使用Linux NPTL的Java新I / O(NIO)

我的web服务器使用通常的Java I / O和每个连接机制的线程。 现在,他们正在增加用户(长轮询连接)的膝盖。 但是,连接大多是空闲的。 虽然这可以通过添加更多的Web服务器来解决,但是我一直在努力对NIO实现进行一些研究。 我对此有了一个混合的印象。 我已经阅读了基准testing,其中Linux中的新NPTL库的常规I / O性能优于NIO。 用Java I / Oconfiguration和使用最新的NPTL for Linux的真实生活经验是什么? 有没有增加的performance? 而在一个更大的范围问题上: 在一个标准的服务器级机器(带有四核处理器的戴尔)中,我们希望正常运行(使用Linux NPTL库?)的I / O和阻塞线程(我们在Tomcat线程池中configuration的)的最大数量是多less? 如果线程池变得非常大,说1000多个线程会有什么影响? 任何引用和指针将非常感激。

Java – IO绑定线程 – 1:1线程模型

在下面的程序中, //Producer – IO bound public class FileCrawler implements Runnable{ private final BlockingQueue<File> fileQueue; private final File root; …. public void run(){ try{ crawl(root); // IO bound }catch(InterruptedException e){ Thread.currentThread().interrupt(); } } private void crawl(File root) throws InterruptedException{ File[] entries = root.listFiles(fileFilter); … for(File entry: entries){ fileQueue.put(entry); } } } //Consumer – CPU bound public […]

没有exec的fork和共享对象使用的pthread_mutex_t

我正在使用一个Web服务器项目,执行没有一个exec fork 。 程序依赖于OpenSSL,而OpenSSL需要一些锁( CRYPTO_NUM_LOCKS是精确的,目前大约是40)。 在Linux上,这些锁通常是pthread_mutex_t ,并且在任何线程创build之前在主线程上安装/创build这些锁。 fork创造一个新的过程。 但是,在fork ,互斥锁中使用的句柄被浅拷贝。 也就是说,他们有相同的位,但我不认为他们在新的过程中有一个有用的价值。 我认为一般的问题是共享对象中的线程和叉的安全问题。 libcrypto上的OpenSSL wiki页讨论了线程和fork的安全性 ,我不知道如何解决一些问题。 有没有办法指定一个库(如OpenSSL)应该在fork上重新初始化?

multithreading文件传输与套接字

我想在C中创build一个multithreading的服务器 – 客户端文件传输系统。有客户端会发送或列出或做其他select(在交换机的情况下,你可以看到)和服务器存储的文件和服务很多的客户。 就我所知,multithreading的意识形态是非常困难的。 它需要太多的经验而不是知识。 我已经在这个项目上工作了一个多星期,而且我一直没能解决问题。 有四种select:第一种是在客户端的目录中列出客户端的本地文件,第二种是在客户端和服务器之间传送的列表文件,第三种是从用户读取文件名,并将文件复制到服务器的目录中。 我的重要问题是关于multithreading。 我无法连接多个客户端。 我已经阅读了代码从一堆到几堆,但我真的不能抓住我的错误,卡住了。 另一个问题是客户端将在SIGINT被捕获时结束,但是,例如,在按ctrl-cselect列表文件后,它不会停止。 服务器文件也是同样的问题。 与客户端捕获相比,更麻烦,因为当服务器获取SIGINT ,客户端将分别从服务器断开连接。 感谢您的帮助! server.c /* Soner Receive a file over a socket. Saves it to output.tmp by default. Interface: ./executable [<port>] Defaults: – output_file: output.tmp – port: 12345 */ #define _XOPEN_SOURCE 700 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <fcntl.h> #include […]

BASH:从两个inputstream中读取的最佳体系结构

这里简单的脚本: a)不断从套接字读取数据并将其存储在关联数组中 b)不断从标准input读取值,如果它们已经存在于关联数组中,则响应t / f a&b是随机事件,不以任何方式关联。 诀窍是从两个subprocess访问数组(因为在后台放置一个进程会产生一个subprocess) 我正在考虑通过最好的策略,并且发生了一些想法,但是我想知道有没有人有更好的想法: 1)将input从套接字redirect到stdin作为subprocess,并在一个while循环中处理两个input(数据大小很小,<30个字符,所以我猜他们将保持primefaces?)。 2)读取套接字,然后读取具有小(0.1?)超时值的STDIN,以模仿非阻塞I / O。 3)更新:将套接字数据写入一个文件(实际上有另一个进程直接写入一个文件),然后每次请求进来检查值是否存在,处理文件中的条目,将它们添加到数组(使用文件locking)。

g ++ 4.8.1 C ++线程,std :: system_error – 操作不允许?

这不是一个重复的问题,因为提供的解决scheme不适用于我的编译器。 我想从这个问题编译并运行下面的示例。 #include <thread> #include <iostream> int main(int, char **){ std::thread tt([](){ std::cout<<"Thread!"<<std::endl; }); tt.join(); } 我曾尝试使用原始问题中提出的解决scheme以及对此重复的接受答案。 不过,尽pipe我尝试了所有列出的组合,并且特别尝试过 g++ main.cpp -o main.out -pthread -std=c++11 当我运行生成的可执行文件时,我仍然可以得到 terminate called after throwing an instance of 'std::system_error' what(): Enable multithreading to use std::thread: Operation not permitted Aborted (core dumped) 这是g++ –version的输出。 g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 Copyright (C) 2013 Free […]

在futex之前,线程/进程如何在Linux中停留和唤醒?

在Linux中存在futex系统调用之前,像pthreads这样的线程库使用底层的系统调用来阻塞/hibernate一个线程,并随后将这些线程从userland中唤醒? 例如,如果一个线程试图获得一个互斥体,那么这个用户空间的实现将阻塞这个线程(也许在一个短暂的空转间隔之后),但是我找不到用于这个的系统调用(除了futex ,创build)。

如何确定一个程序在Linux的堆栈大小?

如何确定在Linux中的程序的当前堆栈大小? 据说在Linux中每个程序的堆栈大小都是8MB,但是当你使用cat / proc时// mmap会显示不同的大小。 另外,如何确定相关线程的堆栈大小? 既然有人说线程有自己的私有堆栈?

多处理器机器中posix线程的并发性

我对多处理器机器中posix线程的并发性有一些怀疑。 我在SO发现了类似的问题,但没有find确凿的答案。 以下是我的理解。 我想知道我是否正确。 Posix线程是用户级线程,内核不知道它。 内核调度程序将把进程(及其所有线程)视为一个调度实体。 线程库依次select运行哪个线程。 它可以在可运行的线程中分割由内核给出的CPU时间。 用户线程可以在不同的CPU核心上运行。 即让线程T1和T2由Process(T)创build,那么T1可以在Cpu1中运行,而T2可以在Cpu2中运行,但是它们不能同时运行 。 请让我知道,如果我的理解是正确的。 谢谢…