Tag: multithreading

读/ dev / urandom线程安全吗?

这是代码: unsigned int number; FILE* urandom = fopen(“/dev/urandom”, “r”); if (urandom) { size_t bytes_read = fread(&number, 1, sizeof(number), urandom); DCHECK(bytes_read == sizeof(number)); fclose(urandom); } else { NOTREACHED(); } 如果没有,我如何使其线程安全?

读取/预制系统调用的线程安全性

我在multithreading环境中几乎没有与read()/ pread()系统调用相关的查询 我正在使用基于freeBsd的Mac-OSX,如果这有助于我在读模式下只使用这个文件,而不是读/写而且语言是c / c ++ 假设我们在磁盘AAAABBBBCCCCDDDEEEE上有一个文件…. 和4个字母适合文件的一页 所以Page1:AAAA 第2页:BBBB …..等等 现在我从具有相同文件描述符的两个不同线程发起读取系统调用,我的意图是从线程1读取第一页,从线程2读取第二页,等等。 阅读(FD,浅黄色,的sizeof(页)); 从手册页我明白,读取也会增加文件指针,所以我肯定会得到像#的乱码 ABCC ABBB ..等(没有特别的顺序) 解决这个问题我可以使用pread() “Pread()执行相同的function,但是从文件中的指定位置读取而不修改文件指针”//来自手册页 但我不确定使用pread是否真的会帮助我实现目标,因为即使它没有增加内部文件指针,也无法保证响应不会混乱。 我的所有数据都是页面对齐的,我想从每个线程中读取一页 线程1读取:AAAA线程2读取:BBBB线程3读取:CCCC …没有实际拼接内容.. 我还发现一个post一旦write()返回,从文件中读取是否安全? 但它不是很有用。 我也不确定read()是否真的会有问题,我正在考虑。我正在阅读的文件是一个二进制文件,因此我很难快速手动阅读和validation.. 任何帮助将不胜感激

使用OpenMP-Tasks的生产者 – 消费者

我正在尝试使用OpenMP中的任务实现并行算法。 并行编程模式基于生产者 – 消费者的想法,但由于消费者流程比生产者慢,我想使用一些生产者和几个消费者。 主要思想是创建与生产者一样多的OS线程,然后每个线程创建要并行完成的任务(由消费者完成)。 每个生产者都将与相应数量的消费者(即numCheckers / numSeekers)相关联。 我在英特尔双芯片服务器上运行该算法,每个芯片有6个内核。 问题在于,当我只使用一个生产者(寻求者)和越来越多的消费者(检查员)时,随着消费者数量的增长,性能衰退得很快(见下表),即使正确的核心数量在100%。 另一方面,如果我增加生产者的数量,平均时间减少或至少保持稳定,即使消费者数量成比例。 在我看来,所有的改进都是通过生产者之间的输入划分来实现的,而且任务只是烦恼。 但同样,我对一个生产者的行为没有任何解释。 我在OpenMP-Task逻辑中遗漏了什么? 难道我做错了什么? ————————————————————————- | producers | consumers | time | ————————————————————————- | 1 | 1 | 0.642935 | | 1 | 2 | 3.004023 | | 1 | 3 | 5.332524 | | 1 | 4 | 7.222009 | | 1 | […]

Java和C / C ++之间MultiThread方面的差异

我已经阅读了一些提示,multithreading实现很大程度上取决于您正在使用的目标操作系统。 操作系统最终提供了multithreadingfunction。 比如Linux有POSIX标准实现和windows32有其他方式。 但我想知道编程语言水平的主要差异。 C似乎为同步提供了更多选择,例如Mutex,读写锁,记录锁定,Posix信号量。 但在Java中,我知道我们可以使用像Mutex这样的同步作品吗? 还有一些其他高级API,比如AtomicXX和volatile。 但我没有找到像记录锁定和读写锁的东西。 它是Java语言的弱点吗? 或者是跨平台的牺牲? 另外我想知道这是一个主要原因,像nginx这样的Web服务器和像oracle这样的数据库都是用C / C ++编写的吗? 我实际上是一名Java开发人员,我对它非常好奇。 希望有人可以给我一些建议。 编辑: Paul和Jesper已经建议Java在JDK1.5之后支持所有类似的锁类,如C / C ++。 但是如果可能的话,我仍然希望有人可以解释为什么Java提供足够支持的更多细节,我们仍然找不到纯Java“oracle”。 编辑: 另外,我想添加一些有趣的东西,我是从Nasi Khan的developer.com上学到的。 了解Javamultithreading和读写锁 。 其中的一些话题。 共享主内存与线程本地内存的交互, 关于这种相互作用和互斥的“同步”的含义。 澄清对象锁和它所守护资源的区别。 编辑: 来自FileLock JavaDocs 文件锁代表整个Java虚拟机。 它们不适合控制同一虚拟机中多个线程对文件的访问。 Java中的文件锁与C / C ++中的文件锁完全相同。 UPDATE 我找到了另一个有趣的区域来比较 在C ++中,有一些类似的东西 atomic x, y; 在JAVA中我们也有AtomicInteger 。 它们是一样的吗?

寻找提供类似于Google Go频道的function的C或C ++库

…用于multithreading网络服务器。 我想在多个线程之间传递数据。 目前我正在使用套接字,select()上的主线程阻塞和recv()上的worker阻塞,尽管我觉得在C ++中可能有更高级或预先打包的方法来处理这个任务。

比较和交换如何工作

我已经阅读了一些post,说比较和交换保证primefaces性,但是我仍然无法得到它是怎么回事。 以下是比较和交换的通用伪代码: int CAS(int *ptr,int oldvalue,int newvalue) { int temp = *ptr; if(*ptr == oldvalue) *ptr = newvalue return temp; } 这如何保证primefaces性? 例如,如果我使用它来实现互斥锁, void lock(int *mutex) { while(!CAS(mutex, 0 , 1)); } 这如何防止2个线程同时获取互斥锁? 任何指针都会非常感激。

为什么pthread_create()会失败,只有2个线程处于活动状态?

我在第一次尝试使用C中的线程时遇到了一些麻烦。我正在尝试(现在)编写一个非常简单的服务器程序,该程序接受套接字连接并启动一个新线程来处理它。 它似乎工作正常,除了它只会在pthread_create()失败并使用EAGAIN代码之前创建大约300个线程(303,有时是304),这意味着: “系统缺少创建另一个线程所需的资源,或者会超出系统对进程中线程总数的限制{PTHREAD_THREADS_MAX}。” 这不是 303个线程同时 – 每个线程退出,由gdb确认。 每次调用进程请求函数时,都会运行两个线程。 所以它意味着“系统缺乏必要的资源”。 我的问题是(而且可能有点愚蠢) – 这些资源是什么? 据推测,这是我程序中的内存泄漏(当然可能,甚至可能),但我认为即使如此,考虑到程序的其余部分很少,它可以管理超过300个。 我怎样才能知道我的程序可用多少内存来确认它已经用完了? 有足够的内存和交换免费,所以可能是操作系统(Linux)强加的人为限制。 谢谢

中断处理程序中的C printf()?

我听说C中的printf()不应该用在ISR中。 是因为它是阻止呼叫,还是因为它不是可重入的? 如果printf()不是可重入的,那么它不会意味着它也不能用于multithreading程序,除非它以某种方式“同步”吗? 谢谢,

英特尔TBB将在AMD处理器上运行?

可能重复: AMD多核编程 英特尔TBB处理器是否依赖? 它会在amd或ARM上运行吗(例如在meeGo下?)

是否有一种编程方式来检查堆栈损坏

我正在使用multithreading嵌入式应用程序。 每个线程都根据其function分配堆栈大小。 最近我们发现其中一个线程通过定义一个超过堆栈大小的局部变量数组来破坏堆栈。 操作系统是uItron。 我的解决方案,我注册了10 mS的计时器,这个计时器将检查堆栈损坏。 堆栈损坏检查方法,1。用一些独特的模式初始化堆栈内存(我使用0x5A5A5A5A)2。检查堆栈内存顶部是否仍然是0x5A5A5A5A 我的问题, 有没有更好的方法来检查这种类型的腐败 忘了添加,立即添加:操作系统:Itron,处理器:ARM9。 编译器:不是GCC(特定于ARM9由处理器供应商提供)……并且没有内置支持堆栈检查…