Articles of multithreading

我如何接受Perl中的多个TCP连接?

我有一个用于Linux的Perl脚本的问题。 主要目的是成为三个应用程序之间的中间人。 它应该做什么: 它应该能够等待$udp_port上的UDP文本(不含空格) 当它收到这个UDP文本时,它应该把它转发给连接的TCP客户端 问题是我的应用程序目前工作,直到我第一次与TCP客户端断开连接。 然后我无法连接到它,并且它在$udp_port上接收到下一个UDP数据包后超时。 所以基本上每当我想重新连接TCP时,我必须重新启动应用程序。 所有这些应该尽可能快(每毫秒计数)。 发送到UDP或TCP的文本不包含空格。 没有必要一次支持多个TCP客户端,但肯定会有好处:-) 这是我现在的代码: #!/usr/bin/perl use strict; use warnings; use IO::Socket; use Net::hostent; use threads; use threads::shared; my $tcp_port = "10008"; # connection from TCP Client my $udp_port = "2099"; # connection from Announcer my $udp_password = ""; # password from Announcer my $title = "Middle Man […]

哪个线程处理信号?

我有2个线程(thread1和thread2)。 我有SIGINT信号处理。 每当SIGINT发生时,线程2都应该处理信号。 为此我写下了程序 void sig_hand(int no) //signal handler { printf("handler executing…\n"); getchar(); } void* thread1(void *arg1) //thread1 { while(1) { printf("thread1 active\n"); sleep(1); } } void * thread2(void * arg2) //thread2 { signal(2, sig_hand); while(1) { printf("thread2 active\n"); sleep(3); } } int main() { pthread_t t1; pthread_t t1; pthread_create(&t1, NULL, thread1, NULL); pthread_create(&t2, NULL, […]

在Linux上如何实现POSIX线程?

我想知道,通过pthreads库创build的线程实际上是内核级线程还是与内核无关的用户空间线程? 我听到了这个相互排斥的意见,所以我想知道事实。

如何在多个线程中使用printf()

我正在实现一个使用不同内核的multithreading程序,并且许multithreading被同时执行。 每个线程都进行printf()调用,结果是不可读的。 我怎样才能使printf()primefaces,以便一个线程中的printf()调用不会与另一个线程中的printf()调用冲突?

如何closures文件?

经过多年的经验,我感到与Posix的和平。 然后,我读了大约2002年的Linus Torvalds的这个消息: int ret; do { ret = close(fd); } while(ret == -1 && errno != EBADF); 没有。 以上是 (a)不可携带 (b)不是目前的做法 “不可移植的”部分来自于(正如有人指出的),内核在错误的情况下closures了FD的线程环境,FD可能已被有效地重新使用(由内核)用于其他线程,第二次closuresFD是一个BUG。 不仅循环,直到EBADF不可移植,但任何循环,由于竞争条件,我可能会注意到,如果我没有“理所当然地把这样的事情理所当然”。 但是,在GCC C ++标准库实现中,我们有basic_file_stdio.cc do __err = fclose(_M_cfile); while (__err && errno == EINTR); 这个图书馆的主要目标是Linux,但似乎没有听取Linus的意见。 据我了解, EINTR只有在系统调用被阻塞后才会发生,这意味着内核在开始任何被中断的工作之前接收到释放描述符的请求。 所以没有必要循环。 事实上, SA_RESTART信号行为不适用于默认情况下close并生成这样的循环,正是因为它是不安全的。 这是一个标准的库错误,对吧? 在每个由C ++应用程序closures的文件上。 编辑:为了避免在一些大师带着答案出现之前引起太多的警告,我应该注意, close似乎只能在特定情况下阻止,也许这些都不适用于常规文件。 我并不清楚所有的细节,但是不应该在没有selectfcntl或setsockopt情况下close EINTR 。 不过,这种可能性使得通用库代码更加危险。

在类中使用静态互斥

我有一个class,我可以有很多的实例。 它内部创build并初始化一些来自第三方库(使用一些全局variables)的成员,并且不是线程安全的。 我想过使用静态boost :: mutex,这将被locking在我的类的构造函数和析构函数。 因此,在我的线程中创build和销毁实例对于第三方成员来说是安全的。 class MyClass { static boost::mutex mx; // 3rd party library members public: MyClass(); ~MyClass(); }; MyClass::MyClass() { boost::mutex::scoped_lock scoped_lock(mx); // create and init 3rd party library stuff } MyClass::~MyClass() { boost::mutex::scoped_lock scoped_lock(mx); // destroy 3rd party library stuff } 我无法链接,因为我收到错误: undefined reference to `MyClass::mx` 我是否需要这种静态成员的特殊初始化? 使用静态互斥锁有什么错误吗? 编辑:链接问题是正确的定义在CPP boost::mutex MyClass::mx;

我如何使用POSIX线程创build一个全局variables,它是C中的线程特定的?

我正在学习有关POSIX线程,我已经到了线程特定数据部分。 本书使用文件描述符做了一个很好的例子。 但是,我想自己做同样的例子,除了这次使用全局variables。 但是,我完全理解这个概念有些困难。 我想要做的是以下几点: 创build一个全局整数 为全局int声明一个键 主要: 设置全局整数是一个值例如。 10 为它创build一个关键没有任何清理 创build4个线程并发送它们来执行thread_func 检查值是否仍然是10,因为线程只能看到它的副本 在thread_func中: 使用pthread_setspecific(键,全局variables)创build一个本地实例 – 不知道我是否正确解释 调用函数 – dosomething() 出口 在do_something中 创build一个本地指针,并将其分配给pthread_getspecific(key) – 这应该让我一个线程特定版本的全局variables 将存储在本地指针的值更改为2 出口 代码如下: #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUMTHREADS 4 pthread_key_t glob_var_key; int glob_var; void do_something() { //get thread specific data int* glob_spec_var = (int*) pthread_getspecific(glob_var_key); printf("Thread %d […]

IPC共享内存和线程内存之间的性能差异

我经常听说,访问进程之间的共享内存段与线程之间访问进程内存相比没有性能损失。 换句话说,multithreading应用程序不会比使用共享内存的一组进程(不包括locking或其他同步问题)更快。 但我有疑惑: 1)shmat()将本地进程虚拟内存映射到共享段。 这个翻译必须为每个共享内存地址执行,并且可能代表一个重要的成本。 在multithreading应用程序中,不需要额外的转换:所有虚拟机地址都转换为物理地址,就像在不访问共享内存的常规进程中一样。 2)共享内存段必须由内核以某种方式维护。 例如,当附加到shm的所有进程都被closures时,shm段仍然是up的,并且最终可以被新启动的进程重新访问。 在shm段上可能会有一些与内核操作相关的开销。 多进程共享内存系统与multithreading应用程序一样快吗?

Linux:system()+ SIGCHLD处理+multithreading

我有一个multithreading的应用程序,它为SIGCHLD安装一个处理程序,用于logging和收集subprocess。 我看到的问题开始时,我正在对system()进行调用。 system()需要等待subprocess结束并自己收割,因为它需要退出代码。 这就是为什么它调用sigprocmask()来阻止SIGCHLD。 但是在我的multithreading应用程序中,SIGCHLD仍然在另一个线程中调用,并且在system()有机会这样做之前收到subprocess。 这是POSIX中的一个已知问题吗? 解决这个问题的方法之一就是在所有其他线程中阻塞SIGCHLD,但在我的情况下,这并不真实,因为并不是所有线程都是由我的代码直接创build的。 我还有什么其他的select?

如何唤醒套接字上的select()?

我目前使用select循环来pipe理代理中的套接字。 此代理的要求之一是,如果代理向外部服务器发送消息,并且在一定时间内没有得到响应,则代理应closures该套接字并尝试连接到辅助服务器。 closures发生在一个单独的线程,而select线程阻止等待活动。 我很难弄清楚如何检测这个套接字是专门closures的,这样我才能处理失败。 如果我在另一个线程中调用close(),我得到一个EBADF,但是我不知道哪个套接字closures了。 我试图通过fdsetexception检测套接字,认为它将包含封闭的套接字,但我没有得到任何返回的东西。 我也听说过调用shutdown()会向服务器发送一个FIN并接收一个FIN回来,这样我就可以closures它; 但整个问题是我试图通过在超时期限内没有得到答复来解决这个问题,所以我也不能这么做。 如果我的假设是错误的,请告诉我。 任何想法,将不胜感激。 编辑:为了响应使用select超时的build议:我需要做asynchronousclosures,因为连接到代理的客户端将超时,我不能等待周围的select被轮询。 如果我把select的时间做得很小,那么这个工作就会起作用,然后不断地投票,浪费我不想要的资源。