别摸我的键盘 的学生作业:
有互斥锁
#include
#include
#include
#include
static int global = 0;
//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mutex;
void *do_thread(void *arg)
{
int loops = *(int *)arg;
int i,tmp = 0;
for (i = 0;i < loops;i++){
pthread_mutex_lock(&mutex);
tmp = global;
tmp++;
global = tmp;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
int err,i = 0;
pthread_t tid[2] = {0};
int loops = 0;
if (argc != 2){
fprintf(stderr,"Usage : < %s > < count loops>\n",argv[0]);
exit(EXIT_FAILURE);
}
loops = atoi(argv[1]);
pthread_mutex_init(&mutex, NULL);
for (i = 0;i < 2;i++){
err = pthread_create(&tid[i],NULL,do_thread,&loops);
if (err != 0){
fprintf(stderr,"[ERROR] pthread_create(): < %s > \n",strerror(err));
exit(EXIT_FAILURE);
}
}
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
pthread_mutex_destroy(&mutex);
printf("global = %d\n",global);
return 0;
}
执行结果
linux@linux:~/test/10-11/1-2$ ./a.out 10000
global = 20000
linux@linux:~/test/10-11/1-2$ ./a.out 100000
global = 200000
linux@linux:~/test/10-11/1-2$ ./a.out 1000000
global = 2000000
linux@linux:~/test/10-11/1-2$ ./a.out 10000000
global = 20000000
无互斥锁代码
#include
#include
#include
#include
static int global = 0;
void *do_thread(void *arg)
{
int loops = *(int *)arg;
int i,tmp = 0;
for (i = 0;i < loops;i++){
tmp = global;
tmp++;
global = tmp;
}
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
int err,i = 0;
pthread_t tid[2] = {0};
int loops = 0;
if (argc != 2){
fprintf(stderr,"Usage : < %s > < count loops>\n",argv[0]);
exit(EXIT_FAILURE);
}
loops = atoi(argv[1]);
for (i = 0;i < 2;i++){
err = pthread_create(&tid[i],NULL,do_thread,&loops);
if (err != 0){
fprintf(stderr,"[ERROR] pthread_create(): < %s > \n",strerror(err));
exit(EXIT_FAILURE);
}
}
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
printf("global = %d\n",global);
return 0;
}
无互斥锁执行结果
linux@linux:~/test/10-11/1-2$ ./a.out 100
global = 200
linux@linux:~/test/10-11/1-2$ ./a.out 200
global = 400
linux@linux:~/test/10-11/1-2$ ./a.out 10000
global = 20000
linux@linux:~/test/10-11/1-2$ ./a.out 100000
global = 123754
linux@linux:~/test/10-11/1-2$ ./a.out 1000000
global = 1003933