我有两个问题:
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;
}
答案 0 :(得分:1)
1.此代码中的变量sum和counter被定义为long long?我将它们改为int,但它没有给我类似的计数,
不确定你的意思。将int
和long long
的{{1}}更改为counter
(并相应地调整sum
格式说明符,例如%
)不应该(有意义)改变程序的含义。在x86_64 Linux中,您将使用32位计数器,而不是64位计数器。
就像没有线程和信号量的代码一样!
好吧,我们需要查看其他程序,但请参见下文。
为什么count得到半随机值(即使再次在for循环中将其设置为零)?
因为有两个并发线程在运行。一个是递增计数器,另一个是每秒重置一次。无法预测其他线程能够递增计数器的次数。它将取决于系统的负载(在同一台机器中运行之间)和系统本身(机器之间,即它的速度)。
通常,唯一一种计数器值可以预测的系统#34;将是一个非OOO,固定频率处理器与确定性调度/操作系统等。一个普通的桌面不是这样的机器 - 事实上完全相反!
我建议您阅读操作系统,调度程序,时间限制等。