Monday, February 19, 2007

Any bug here?

Ridiculous fish เขียน post ดีๆอีกแล้ว
คราวนี้เขาแสดงให้ดูว่า
code ข้างล่างนี้มี bug ได้อย่างไร
(เพื่อความสนุกในการอ่าน, ให้พยายามไล่ดู code ก่อน
ว่ามันจะมี bug v2 > v1 ได้อย่างไร)
unsigned variable1 = 0;
unsigned variable2 = 0;

#define ITERATIONS 50000000

void *writer(void *unused) {
for (;;) {
variable1 = variable1 + 1;
variable2 = variable2 + 1;
}
}

void *reader(void *unused) {
struct timeval start, end;
gettimeofday(&start, NULL);
unsigned i, failureCount = 0;
for (i=0; i < ITERATIONS; i++) {
unsigned v2 = variable2;
unsigned v1 = variable1;
if (v2 > v1) failureCount++;
}
gettimeofday(&end, NULL);
double seconds = end.tv_sec + end.tv_usec / 1000000. - start.tv_sec - start.tv_usec / 1000000.;
printf(”%u failure%s (%2.1f percent of the time) in %2.1f seconds\n”,
failureCount, failureCount == 1 ? “” : “s”,
(100. * failureCount) / ITERATIONS, seconds);
exit(0);
return NULL;
}

int main(void) {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, writer, NULL);
pthread_create(&thread2, NULL, reader, NULL);
for (;;) sleep(1000000);
return 0;
}

Related link from Roti

1 comment:

bact' said...

ไปอ่านแล้ว โห!

เห็นโค้ดตอนแรกก็รู้ว่ามันเกิดจากเรื่องเธรด มันคร่อมกันได้

แต่น่าสนใจตอนที่ทำไมทดสอบแล้วมันไม่ยอมเจอ

เยี่ยมมาก