以下是为了模仿基本网页计数器而编写的程序。 'cnt'保存计数器值,程序重复100次,以模仿100次访问页面。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// repeat 100 times to mimic 100 random visits to the page
#define RPT 100
//web page visit counter
int cnt=0;
void* counter() {
int cntLocalCopy;
float r;
cntLocalCopy = cnt;
// mimicking the work of the sever in serving the page to
// the browser
r = rand() % 2000;
usleep(r);
cnt = cntLocalCopy + 1;
}
int main () {
int i;
float r;
pthread_t tid[RPT];
// seed the random number sequence
srand(time(NULL));
for (i=0; i<RPT; i++) {
// mimicking the random access to the web page
r = rand() % 2000;
usleep(r);
// a thread to respond to a connection request
pthread_create (&tid[i], NULL, &counter, NULL);
}
// Wait till threads complete.
for (i=0; i<RPT; i++) {
pthread_join(tid[i], NULL);}
// print out the counter value and the number of mimicked visits
// the 2 values should be the same if the program is written
// properly
printf ("cnt=%d, repeat=%d\n", cnt, RPT);
}
因此代码产生了一些输出如下('cnt'是'网站'的访问者数量,并重复'对该网站进行100次随机访问'。
这是一个系统工程和多线程问题。
基本上我想知道为什么输出大约是60而不是100(或近似),以及我如何进行更改以使代码比我得到的值更准确,更一致地运行。 / p>
cnt=63, repeat=100
cnt=59, repeat=100
cnt=58, repeat=100
cnt=63, repeat=100
cnt=59, repeat=100
cnt=59, repeat=100
答案 0 :(得分:1)
由于data races,您获得的值较小:两个主题可能会读取cnt
的相同值,并且会将其更新为cnt+1
而不是ctn+1
和{{1} }:
cnt+2
您需要针对这些数据竞赛采取行动,包括semaphores,mutex,memory barriers,atomic functions等。