Articles of ++

让一个任务运行一个固定数量的指令?

在把控制返回给用户之前,是否有可能安排一个给定的任务来正确运行n机器指令? 这个问题的动机是multithreading程序的debugging,这可能有助于可靠地重现某些错误或未定义的行为。 我特别感兴趣的是x86_64-linux在Intel CPU上运行的情况,但其他体系结构或操作系统的解决scheme也会很有趣。 内核perf套件的文档说 性能计数器是大多数现代CPU上可用的特殊硬件寄存器。 这些寄存器计算某些types的hw事件的数量:例如执行的指令,遭受的cachemisses或分支错误预测 – 不减慢内核或应用程序。 当事件达到阈值时,这些寄存器也可以触发中断。 所以似乎硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。 当然也可以使用ptrace来单步执行这个程序n次,但是除了最简单的程序之外,其他所有的程序都可能会很慢。

epoll集合中fd和关联状态的映射

当您将一个fd添加到epoll集时,可以使用“struct epoll_event.data”将某个状态与它关联。 当epoll在fd上报告一个事件时,它当然会把相关数据和事件一起返回给用户。 这意味着epoll集合正在维护fds和相关状态之间的映射。 假设我将epoll_event.data.ptr设置为dynamic分配的某些状态,并且在将来的某个时刻,我想从epoll集合中删除fd,从而释放之前在ptr中设置的内存。 据我所知,对于我来说,没有一个程序化的方法来查找一个epd集合中与fd相关的状态来完成上述任务。 我目前维护我自己的FDS和相关联的状态之间的映射。 我明白,保持这种映射不需要太多的内存,但我仍然觉得在两个不同的地方维护相同的映射效率不是很高。 所以我的问题是:有没有办法检索一个epd集合中的fd相关的状态?

如何设置程序中OpenMP线程的数量?

作为运行程序 $ OMP_NUM_TRHEADS=4 ./a.out 将活动的OpenMP线程的数量限制为4,如htop 。 但是,如果不是绑定Bash的OMP_NUM_THREADS环境variables,我会调用它 setenv("OMP_NUM_THREADS", "4", 1); 在调用任何启用OpenMP的函数之前,从main调用,这似乎不起作用。 为什么发生这种情况? 如何设置程序中OpenMP线程的数量(如果可能的话)?

为什么单线程比使用pthread的Ubuntu中的multithreading更快?

XUbuntu 14.04,2个处理器。 multithreading成本0.8s,而单线程成本只有0.4s。 如果定义了MULTI_THREAD ,那么程序将在单个线程中运行。 否则,这是一个multithreading程序 怎么了? —————-code—————————— #include <pthread.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define MULTI_THREAD #define NUM 10000 #define SEM_M 10 int arr[NUM]; FILE *f; typedef struct _SemData{ sem_t sem_full; sem_t sem_empty; }SemData; void InitSemData(SemData *sd){ sem_init(&sd->sem_full,0,0); sem_init(&sd->sem_empty,0,SEM_M); } void DestroySemData(SemData *sd){ sem_destroy(&sd->sem_full); sem_destroy(&sd->sem_empty); } void *Produce(void* data){ #ifdef MULTI_THREAD […]

在dup赛后安全吗?

在Linux上,pwrite操作(seek + write)是primefaces操作,这意味着在一个文件描述符的多个线程中执行pwrite-s是安全的。 我想创build文件描述符复制,使用dup()。 现在有了fd1和fd2,pwrite-s会如预期那样工作,还是会有竞争状态的危险?

Linux进程ID和线程ID

假设我们有许多在Linux上运行的用户进程。 每个进程都有很multithreading在运行。 我可以通过调用getpid()来获得进程ID,其返回值是一个整数。 我可以通过调用pthread_self()来获得线程ID,其返回值是一个不透明的types,称为pthread_t 。 现在我需要在共享内存中存储进程ID(一个int,通常是4个字节)和线程ID( pthread_t ,需要计算出多less字节),以便稍后可以使用这两个ID信息来标识特定线程并检查线程是否仍在运行。 我发现许多在线源将pthread_t转换为unsigned int或unsigned long 。 由于我不希望在转换过程中丢失任何数据,我应该如何处理pthread_t数据,以便它是一个固定大小的数据(如上所述,我需要将线程信息存储在共享内存中)。 另外,如何通过后面的进程标识和线程标识的组合来识别特定的线程? 如何检查线程是否仍在运行?

谁在epoll_wait()中分配事件/接口ID进行处理

这个问题从很久以来就让我感到困扰。 我想知道,在event polling机制的情况下。 当我有一个代码,我说我有3个FD轮询,我已经分配了每个interface type的事件将被确定的每个FD。 处理也使用epoll_wait()完成,然后使用epoll_wait()接收事件。 Say: 3 FDs. 1 Timer, 1 IPC, 1 MQTT -> Creation using epoll_create 但我的问题是谁分配事件ID或接口ID作为事件的类别的外部事件和他们各自的接口将永远是内部的。 如果我的问题是清楚的,请让我知道。

中断阻塞来自并行线程的调用

下面的简单代码例证了一个问题,我正在唤醒一个阻塞在驱动程序调用的线程。 我没有驱动程序的源代码,但是如果驱动程序阻塞的物理设备发生电源中断,则需要唤醒线程才能closures进程。 示例(请参阅下面的代码): main()为SIGINT设置一个信号处理程序,启动一个子线程,然后进入一个无限循环,当它醒来时,它会重复地hibernate,醒来并打印出来。 子线程执行相同的操作,但每次唤醒时都会向进程发送SIGINT 。 sleep()被用作一个简单的阻塞调用。 运行代码显示以下行为: 每次子线程唤醒时,它都会打印出'When'消息(当它醒来的时候)。 然后信号处理程序报告它收到了SIGINT 。 每次“主”唤醒时,都会打印出“何时”消息。 如下: main: 0.127 Child: 0.127 SignalHandler: signum = 2 Child: 5.127 SignalHandler: signum = 2 main: 7.127 Child: 10.127 SignalHandler: signum = 2 main: 14.127 Child: 15.128 SignalHandler: signum = 2 Child: 20.128 SignalHandler: signum = 2 main: 21.127 . . . 我期望,由于进程收到SIGINT的结果, […]

你通常在哪里安装你从源代码构build的libaries的debugging版本?

你通常在哪里安装你从源代码构build的libaries的debugging版本,比如在/ usr / local / debug目录下,还有其他的东西? 考虑一下你用于开发程序的软件库。 如果您需要在debugging器下进入库的源代码,则需要不经优化而生成debugging符号的库构build。 另一方面,为了正常运行应用程序或估计性能,您通常使用库的“发布”版本,这样的版本通常安装在/ usr / local(默认前缀)下。 谢谢

线程安全的方式来转换时区之间的时间

我正在写一个应用程序将utc-time转换为不同的时区,现在我可以使用这样的东西 putenv("TZ=TIMEZONE1"); tzset() … do time conversions 但我不认为它是线程安全的,那么是否有任何C / C + +库可以做时区转换以时区作为参数的function,而不是一些全球