下面这段代码的运行结果是不正确的,而且输出的p_int中的整型值不确定,这次运行输出的可能是9995,下次运行输出的可能是9996,9997等,这段代码说明运算符+=并不能保证线程安全,+=在C语言中属于非原子操作.如果要得到正确的结果需要加锁.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD 10000
void *P_fun(void *arg)
{
int *p_int = (int *)arg;
*p_int += 1;
return (void *)0;
}
int main(int argc, char const *argv[])
{
int *p_int = (int *)malloc(1 * sizeof(int));
pthread_t pt[THREAD];
for (size_t i = 0; i < THREAD; i++)
{
pthread_create(&pt[i], NULL, P_fun, (void *)p_int);
}
for (size_t i = 0; i < THREAD; i++)
{
pthread_join(pt[i], NULL);
}
printf("%d\n", *p_int);
return 0;
}
下面我给这段代码加上互斥锁,再运行一下.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD 10000
typedef struct _memem
{
int num;
pthread_mutex_t lock;
}myint;
void *P_fun(void *arg)
{
myint *p_int = (myint *)arg;
pthread_mutex_lock(&(p_int->lock));
p_int->num += 1;
pthread_mutex_unlock(&p_int->lock);
return (void *)0;
}
int main(int argc, char const *argv[])
{
myint *p_int = (myint *)malloc(1 * sizeof(myint));
pthread_t pt[THREAD];
pthread_mutex_init(&(p_int->lock), NULL);
for (size_t i = 0; i < THREAD; i++)
{
pthread_create(&pt[i], NULL, P_fun, (void *)p_int);
}
for (size_t i = 0; i < THREAD; i++)
{
pthread_join(pt[i], NULL);
}
printf("%d\n", p_int->num);
free(p_int);
return 0;
}
经过加锁以后,运行结果就完全正确了: