能帮忙看下这段代码为什么会出现这种结果吗? 关于线程的
代码很简单,启动两个线程,一个对全局变量all加1(用for循环操作360次),另一个减1
但是运行结果却很奇怪,好像每个线程会拥有一个all的拷贝一样,对all操作是对这个拷贝操作,而不是对全局变量操作
#include <stdio.h>#include <string.h>#include <windows.h>#define NOPV 1int demo(int argc, char *argv[]);volatile int all = 0;long allsingal = 1;int p(long &singal){ #ifdef NOPV return 1; #endif printf("p\n"); while(singal <= 0) { Sleep(1); } singal--; return 0;}int v(long &singal){ #ifdef NOPV return 1; #endif printf("v\n"); singal++; return 0;}DWORD __stdcall threadadd(LPVOID pfin){ int *finshed = (int *)pfin; int tmp; for (int i = 0; i < 360; i++) { // p(allsingal); tmp = ::all; printf("add all = %d\n", all); Sleep(10); ::all = tmp + 1;// v(allsingal); } *finshed = 1; return 0;}DWORD __stdcall threaddec(LPVOID pfin){ int *finshed = (int *)pfin; int tmp; for (int i = 0; i < 360; i++) {// p(allsingal); tmp = ::all; printf("dec all = %d\n", all); Sleep(10); ::all = tmp - 1;// v(allsingal); } *finshed = 1; return 0;}int main(int argc, char *argv[]){ printf("%d\n" ,argc); DWORD nID1; DWORD nID2; int EndT1 = 0; int EndT2 = 0; CreateThread(NULL, 0, threadadd, &EndT1, 0, &nID1); CreateThread(NULL, 0, threaddec, &EndT2, 0, &nID2); while(!(EndT1 & EndT2)) { printf("all = %d\n", all); Sleep(10); } printf("all = %d\n", all); return 0;}