解决线程中出现不正常的情况(多线程项目遗留问题)
解决问题的关键点:
理解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); } }
代码运行结果:
问题得以解决!