1 编译运行程序,提交截图 2 针对自己上面的截图,指出程序运行中的问题 3 修改程序,提交运行截图



存在的问题:
每次得到的答案都不相同,两个线程不互斥。
我们没有办法预测操作系统是否将为你的线程选择一个正确的顺序。
修改代码为:
/*
* badcnt.c - An improperly synchronized counter program
*/
/* $begin badcnt */
#include "csapp.h"
void *thread(void *vargp); /* Thread routine prototype */
/* Global shared variable */
volatile int cnt = 0; /* Counter */
pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;//临界资源
int main(int argc, char **argv)
{
int niters;
pthread_t tid1, tid2;
/* Check input argument */
if (argc != 2) {
printf("usage: %s <niters>
", argv[0]);
exit(0);
}
niters = atoi(argv[1]);
/* Create threads and wait for them to finish */
Pthread_create(&tid1, NULL, thread, &niters);
Pthread_create(&tid2, NULL, thread, &niters);
Pthread_join(tid1, NULL);
Pthread_join(tid2, NULL);
/* Check result */
if (cnt != (2 * niters))
printf("BOOM! cnt=%d
", cnt);
else
printf("OK cnt=%d
", cnt);
exit(0);
}
/* Thread routine */
void *thread(void *vargp)
{
int i, niters = *((int *)vargp);
pthread_mutex_lock( &counter_mutex );
for (i = 0; i < niters; i++) //line:conc:badcnt:beginloop
cnt++; //line:conc:badcnt:endloop
pthread_mutex_unlock( &counter_mutex );
return NULL;
}
/* $end badcnt */
