Articles of multithreading

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的时间做得很小,那么这个工作就会起作用,然后不断地投票,浪费我不想要的资源。

如何在pthread中终止睡眠线程?

我有长时间睡觉的线程,然后醒来做些事情,然后再睡觉,像这样: while(some_condition) { // do something sleep(1000); } 我怎样才能让这个线程优雅地退出,很快? 我试图使用pthread_cancel() ,但睡眠线程无法取消。 我也尝试改变while循环的条件,但是它仍然需要很长时间才能退出。 而且我不想使用pthread_kill() ,因为它可能会在线程工作时终止。 那么,有什么好主意吗?

在multithreading的同一个TCP套接字上发出阻塞write()调用是否安全?

假设我有两个线程T1和T2。 线程T1在TCP套接字S上进行阻塞write()调用,以发送字节B1的大缓冲区。 字节B1的缓冲区非常大,以至于(a)写入调用块和(b)TCP必须使用多个段来发送缓冲区。 线程T2还在同一个TCP套接字S上进行阻塞write()调用,以发送字节B2的其他大缓冲区。 我的问题是这样的: 在UNIX上实现TCP是否保证B1的所有字节将在B2的所有字节之前发送(反之亦然)? 或者TCP是否可能交错B1和B2的内容(例如,TCP发送带有B1数据的段,然后是带有B2数据的段,然后是带有B1数据的段)。 PS – 我知道这不是一个好主意。 我试图确定一些我没有写的代码是否正确。

C ++,linux:如何限制函数访问文件系统?

我们的应用程序是从SU或普通用户运行的。 我们有一个图书馆,我们已经连接到我们的项目。 在那个库里有一个我们想调用的函数。 我们在运行应用程序的目录中有一个名为notRestricted的文件夹。 我们已经创build了一个新的线程。 我们想要限制对文件系统的访问。 我们想做的事情很简单 – 调用该函数,但限制其只能写入该文件夹(我们更喜欢让它从任何地方读取应用程序)。 更新:所以我看到没有办法只禁用一个线程从所有的FS,但一个文件夹… 我读了你的命题亲爱的SO用户,并在这里发布了一些类似于这个问题,所以在那里给了我们一个没有坏api的 沙箱的链接,但我真的不知道它是否会在除GentOS之外的任何东西上工作在使用Boost.Process命令行运行它并运行所需的ex-thread(迁移到分离应用程序=))的情况下,这种脚本看起来相当有用。

pthread中两个线程之间的通信

我正在创build两个线程thread1和thread2。 线程1正在读取模拟值,线程2将处理在线程1中读取的模拟值并设置PWM参数。 我到现在为止所做的是,在主文件(我正在创build线程)我已经声明了一个全局variables(存储模拟值),并将指针传递给全局variables的两个线程。 在线程1中,存储在全局variables和线程2中的读取模拟值读取全局variables并对其进行处理。 所以,我的问题是有没有其他的方法来做到这一点? 即我们有信号量,互斥等最适合这个应用程序?

使用free()时内存使用不会减less

我正在写OS独立的无锁队列,到目前为止它工作的很好,但内存pipe理有一个小问题。 我不确定它的gcc问题还是我的。 问题:当元素被添加到列表时内存增加,但是当元素从列表中移除(free(elementPointer);)时,内存使用不会改变。 但是当我使用pthreads的时候,N个生产者和M个消费者(1<N<20, 1<M<20) 20,1 (1<N<20, 1<M<20)内存使用量一直是~10mb左右(试图添加和移除〜10kk元素时),所以看起来像free加工。 而有趣的是,在VS 2010(相同的代码,没有线程)免费的罚款,内存释放(观看任务pipe理器)。 我做了testing,添加了1kk元素,全部join后,逐个删除了所有元素(没有线程)。 Linux – 0.08秒 Windows〜57秒 Linux(不含免费) – 0.07秒 Windows(不含免费) – 0.9秒 所以,问题是,为什么在没有线程使用的情况下,Linux C中没有释放内存? 如有必要,我可以发布代码。 GCC版本:4.4.3

在Linux中fopen()是一个线程安全的函数吗?

如果我使用fopen()调用在multithreading中打开同一个文件,并将数据写入文件。 我应该使用互斥锁来确保数据不会混乱吗?

了解Pthreads

我在高级Linux编程中遇到了一个概念。 这里有一个链接 :参考4.5 GNU / Linux线程实现 。 我很清楚作者所说的概念,但是我已经解释了为打印线程的processID所解释的程序。 这是代码 #include <pthread.h> #include <stdio.h> #include <unistd.h> void* thread_function (void* arg) { fprintf (stderr, "child thread pid is %d\n", (int) getpid ()); /* Spin forever. */ while (1); return NULL; } int main () { pthread_t thread; fprintf (stderr, "main thread pid is %d\n", (int) getpid ()); […]