Articles of multithreading

使用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 ()); […]

pthread_join是如何实现的?

我有点新的线程,所以你不得不原谅这个问题的天真。 pthread_join是如何实现的,它是如何影响线程调度的? 我总是用一个while循环来描述pthread_join实现,只是让调用线程产生,直到目标线程完成。 像这样(非常近似的伪代码): primefaces布尔完成; thread_run { 做东西(); done = true; } thread_join { while(!done){ thread_yield(); 基本上,使调用“join”的线程 //我们的线程产生,直到我们的线程完成 } } 这是一个准确的描述,还是我极大地简化了这个过程? 干杯!

在Linux上,如何确保解锁locking在死亡/终止的线程中的互斥锁?

这是一个面试问题。 在Linux上,如何确保解锁locking在POSIX线程死亡/终止的POSIX互斥锁? 我的想法: 当发送kill或终止信号到程序时,Linux会自动释放它? 但是,我无法find有关操作系统如何操作的更多细节? 谢谢

Linux中使用条件variables的Windows事件实现?

我正试图在Linux中实现非常简单的Windows事件。 只为我的情况 – 3个线程,1个主要和2次要。 每个辅助线程通过SetEvent引发1个事件,主线程等待它。 例: int main() { void* Events[2]; Events[0] = CreateEvent(); Events[1] = CreateEvent(); pthread_start(Thread, Events[0]); pthread_start(Thread, Events[1]); WaitForMultipleObjects(2, Events, 30000) // 30 seconds timeout return 0; } int* thread(void* Event) { // Do something SetEvent(Event); // Do something } 所以,要实现它,我使用条件variables。 但是我的问题是 – 这是正确的吗? 或者我做错了什么? 我的实现: // Actually, this function return pointer […]

有多less线程创build和什么时候?

我有一个networkingLinux应用程序接收来自多个目的地的RTPstream,做非常简单的数据包修改,然后转发stream到最终的目的地。 如何决定我应该有多less线程来处理数据? 我想,我不能打开每个RTPstream的线程,因为可能有成千上万。 我应该考虑CPU内核的数量吗? 还有什么事呢? 谢谢。

将线程绑定到处理器

当我运行我的multithreading代码时,系统(linux)有时会将线程从一个处理器移到另一个处理器。 由于我拥有的处理器数量与我的处理器数量一样多,因此无法正确使用caching,导致跟踪活动混淆。 你知道如何将线程绑定到处理器,为什么系统会这样做?

C读和线程安全(linux)

如果在同一个文件描述符(让我们感兴趣的是一个本地文件,它是一个套接字文件描述符)中调用两个不同的线程中的read (或write ,或两者),将会发生什么情况,而不使用显式的同步机制? 读和写是系统调用,因此,在单核CPU上,两个读操作可能同时执行可能是不吉利的。 但是,多核心… Linux内核将会做什么? 让我们来更一般一点:其他内核(如BSD)的行为总是一样的吗? 编辑:根据closures的文档 ,我们应该确保该文件描述符不被其他线程中的系统调用使用。 因此,在closures一个文件描述符之前,需要明确的同步(如果线程可能调用它仍然在运行,那么还需要读/写)。

我想等待一个文件描述符和一个互斥量,推荐的方法是什么?

我想产生线程来执行某些任务,并使用线程安全队列与他们进行通信。 在等待的时候,我也想对各种文件描述符进行IO操作。 推荐的方法是什么? 当队列从没有元素到某些元素时,我是否必须创build一个线程间pipe道并写入它? 没有更好的方法吗? 如果我必须创build线程间pipe道,为什么没有实现共享队列的库允许您创build共享队列和线程间pipe道作为单个实体? 我想这么做是否意味着一个基本的devise缺陷? 我正在问这个关于C ++和Python的问题。 我对一个跨平台的解决scheme很感兴趣,但主要对Linux感兴趣。 更具体的例子 我有一些代码将在文件系统树中search的东西。 我有几个通过sockets向外界开放的沟通渠道。 可能(或不可能)导致需要search文件系统树中的东西的请求将到达。 我将隔离在一个或多个线程中search文件系统树中的东西的代码。 我想要请求导致需要search树,并把它们放在一个线程安全的队列中,由search器线程完成。 结果将被放入已完成search的队列中。 我希望能够在search过程中快速处理所有的非search请求。 我希望能够及时处理search结果。 处理传入的请求通常意味着某种使用epoll的事件驱动架构。 磁盘search请求队列和结果返回队列将暗示使用互斥或​​信号量来实现线程安全的线程安全队列。 等待空队列的标准方法是使用条件variables。 但是如果我在等待的时候需要处理其他的请求,那将是行不通的。 要么我总是轮询结果队列(并且平均延迟轮询间隔的一半),阻塞和不处理请求。