单核心CPU上运行多线程程序为何仍需锁机制?
单核心CPU多线程自增操作的异常疑问
在单核心CPU上运行了如下多线程程序:
#include <pthread.h> #include <stdio.h> #include <stdint.h> #include <inttypes.h> #include <string.h> #define THREAD_NUM 4 #define SUM_LOOP_SIZE 100000 uint64_t sum; void * thread(void *arg) { for (int i = 0; i < SUM_LOOP_SIZE; i++) { sum++; } return NULL; } int main() { pthread_t tid[THREAD_NUM]; uint64_t counter = 0; while (1) { counter++; for (int i = 0; i < THREAD_NUM; i++) { int ret = pthread_create(&tid[i], NULL, thread, NULL); if (ret != 0) { fprintf(stderr, "Create thread error: %s", strerror(ret)); return 1; } } for (int i = 0; i < THREAD_NUM; i++) { int ret = pthread_join(tid[i], NULL); if (ret != 0) { fprintf(stderr, "Join thread error: %s", strerror(ret)); return 1; } } if (sum != THREAD_NUM * SUM_LOOP_SIZE) { fprintf(stderr, "Exit after running %" PRIu64 " times, sum=%" PRIu64 "\n", counter, sum); return 1; } sum = 0; } return 0; }
程序逻辑为:4个线程对全局变量sum各执行100000次自增操作,若最终sum结果不等于400000则退出程序。运行结果如下:
$ ./multi_thread_one_cpu Exit after running 17273076 times, sum=200000 $ ./multi_thread_one_cpu Exit after running 1539708 times, sum=100000
已知sum++是非原子的读-改-写操作,但存在疑问:单核心CPU既然能感知整个程序状态,为何不能“智能”地完成一个sum++后再处理另一个?另外测试所用CPU为ARM而非x86,不确定这是否有影响。
内容的提问来源于stack exchange,提问作者Nan Xiao
相关产品推荐
相关产品推荐

