gpt4 book ai didi

c - C中的多线程和O3编译

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:12 34 4
gpt4 key购买 nike

我正在编写代码,尝试尽可能快地检测信号何时从 0 变为 1(实时应用程序)。我有以下两个功能

void *SensorSignalReader (void *arg)
{

char buffer[30];
struct timeval tv;
time_t curtime;

srand(time(NULL));

while (1) {
int t = rand() % 10 + 1; // wait up to 1 sec in 10ths
usleep(t*100000);

int r = rand() % N;
signalArray[r] ^= 1;

if (signalArray[r]) {
changedSignal = r;
gettimeofday(&tv, NULL);
timeStamp[r] = tv;
curtime = tv.tv_sec;
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Changed %5d at Time %s%ld\n",r,buffer,tv.tv_usec);
}
}
}

void *ChangeDetector (void *arg)
{
char buffer[30];
struct timeval tv;
time_t curtime;
int index;

while (1) {

while (changedSignal == -1) {} // issues with O3
gettimeofday(&tv, NULL);
index = changedSignal;
changedSignal = -1;

curtime = tv.tv_sec;
if(timeStamp[index].tv_usec>tv.tv_usec){
tv.tv_usec += 1000000;
tv.tv_sec--;
}
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Detcted %5d at Time %s%ld after %ld.%06ld sec\n---\n",index,buffer,tv.tv_usec,
tv.tv_sec - timeStamp[index].tv_sec,
tv.tv_usec - timeStamp[index].tv_usec);
}
}

我有 2 个 pthreads 一直在运行,每个函数一个。当我正常编译时 (gcc -lpthread) 这按预期工作。 SensorSignalReader 更改 changedSignal 并且 ChangeDetector 在 while 循环中断时检测到它。当我使用 -O3 或标志编译时,感觉变量 changedSignal 从未改变?当信号不断变化时,ChangeDetector 中的 while 循环将永远运行。如果我在里面放一个 printf("%d\n",changedSignal);,它会一直打印 -1。 O3 做了一些我不明白的事情。这是什么?

最佳答案

很可能您的程序正在经历未定义的行为,而您只是幸运地没有打开优化。

changedSignal 似乎是共享资源,因此您需要使用原子操作或某种形式的锁定来确保线程不会同时访问它。

您可以使用 pthread 函数进行锁定或使用 gccbuiltin functions for atomic operations .

编辑:正如 Olaf 所指出的,您似乎正在尝试实现生产者-消费者模式。您可能想尝试使用 condition variables 来实现它而不是试图重新发明它。

关于c - C中的多线程和O3编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689224/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com