解决线程中出现不正常的情况(多线程项目遗留问题)
解决问题的关键点:
理解count++的汇编代码过程如下:
// count++ 汇编过程
mov [count], eax; //count的值在内存中,移到寄存器当中
inc eax; //寄存器自增
mov eax, [count]; //再将寄存器的值,移动到count中。
1.正常情况:
2.不正常的情况:
导致两个线程的自增只自增了一次,造成十个线程增加十万没有达到百万的原因。
互斥锁解决方案:
通过在每个线程前加锁,线程结束时解锁的方式。
代码如下:
#include <stdio.h>
#include <pthread.h>
#define THREAD_COUNT 10
pthread_mutex_t mutex; //互斥锁定义
void *thread_callback(void *arg) {
int *pcount = (int *)arg;
int i = 0;
while (i ++ < 100000) {
#if 0
(*pcount) ++; //
#else
pthread_mutex_lock(&mutex);
(*pcount) ++; //
pthread_mutex_unlock(&mutex);
#endif
usleep(1);
}
}
int main () {
pthread_t threadid[THREAD_COUNT] = {0};
pthread_mutex_init(&mutex, NULL); //初始化,为NULL时为系统默认属性
int i = 0;
int count = 0; //共享资源计数
//创建十个线程
for (i = 0;i < THREAD_COUNT;i ++) {
//带有四个参数 1.返回的线程id地址 2.线程的属性(堆、栈)3.xc入口函数
//4.主线程往子线程传的参数
pthread_create(&threadid[i], NULL, thread_callback, &count);
}
for (i = 0;i < 100;i ++) {
printf("count : %d\n", count);
sleep(1);
}
}
代码运行结果:
问题得以解决!