gpt4 book ai didi

c - 为信号量定义变量

转载 作者:行者123 更新时间:2023-11-30 14:48:19 25 4
gpt4 key购买 nike

我有两个问题:

  1. 此代码中的变量 sum 和 counter 定义为长长?我将它们更改为 int ,但它没有给我类似的计数,就像没有线程和信号量的代码一样!为什么 count 会得到半随机值(即使在 for 循环中再次将其设置为零)?
  2. 如何达到 1+2+3.../10 ?我的意思是,类型的影响是什么变量(与信号量、进程和线程无关的变量。即 pid_t)?

提前谢谢您。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <semaphore.h>
sem_t s1;
char running = 1;
long long counter = 0;
void * process() {
while (running) {
sem_wait(&s1);
counter++;
sem_post(&s1);
}
printf("Thread: exit\n");
pthread_exit(NULL);
}

int main() {
int i;
long long sum = 0;
pthread_t thread_Id;
sem_init(&s1, 0, 1);
if (pthread_create(&thread_Id, NULL, process, NULL)) {
printf("ERROR in pthread_create()\n");
exit(-1);
}

for (i=0 ; i < 10 ; i++) {
sleep(1);
sem_wait(&s1);
printf("counter = %lld\n", counter);
sum += counter;
counter = 0;
sem_post(&s1);
}

sem_wait(&s1);
running = 0;
sem_post(&s1);
pthread_join(thread_Id, NULL);
printf("Average Instructions = %lld \n", sum/10);

return 0;

}

最佳答案

1.the variables sum and counter in this code are defined as long long ? I changed them into int , but it did not give me similar counting,

不知道你的意思是什么。将 countersumint 更改为 long long (并调整 %相应的格式说明符(例如 %d)不应(有意义地)改变程序的含义。在 x86_64 Linux 中,您将使用 32 位计数器,而不是 64 位计数器。

like the codes without threads and semaphore!

好吧,我们需要查看其他程序,但请参见下文。

why count get semi-random values (even by setting it to zero in for loop again)?

因为有两个并发线程在运行。一个是递增计数器,另一个是每秒重置它。无法预测其他线程能够增加计数器多少次。它将取决于系统的负载(在同一台机器上的运行之间)和系统本身(在机器之间,即它的速度有多快)。

通常,唯一可以“预测”计数器值的系统是具有非 OOO、固定频率处理器和确定性调度程序/操作系统等的系统。普通桌面不是这样的机器 - - 事实上,完全相反!

我建议阅读操作系统、调度程序、时间片等方面的内容。

关于c - 为信号量定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50482404/

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