计数器值小于访问次数的网页计数器

时间:2018-05-04 12:33:37

标签: c multithreading concurrency operating-system system

以下是为了模仿基本网页计数器而编写的程序。 '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

1 个答案:

答案 0 :(得分:1)

由于data races,您获得的值较小:两个主题可能会读取cnt的相同值,并且会将其更新为cnt+1而不是ctn+1和{{1} }:

cnt+2

您需要针对这些数据竞赛采取行动,包括semaphoresmutexmemory barriersatomic functions等。