c语言多线程运行后为什么值会变成这样

问题描述

c语言多线程运行后为什么值会变成这样

请问为什么运行下列程序后,gCount的值不为5,而是为一个莫名其妙的随机数啊?
如果说是多线程影响的,那毕竟加和减在两个函数里都限定死了为10000000次,那运算结果应该还是为5啊?
整个运行机制到底是怎样的?
求大神解答!

#include
#include
#include

volatile unsigned int gCount=5;
//gCount是全局共享变量,volatile表明不进行优化

unsigned __stdcall FirstThreadFunc(void *pArguments)
{
int i;
for(i=0;i<10000000;i++)
{
gCount=gCount+1;
}
return 0;
}

unsigned __stdcall SecondThreadFunc(void *pArguments)
{
int i;
for(i=0;i<10000000;i++)
{
gCount=gCount-1;
}
return 0;
}

int main()
{
HANDLE hThread[2];
unsigned threadID[2];

printf("gCount的初始值为%dn",gCount);

hThread[0]=(HANDLE)_beginthreadex(NULL,0,FirstThreadFunc,NULL,0,&threadID[0]);
hThread[1]=(HANDLE)_beginthreadex(NULL,0,SecondThreadFunc,NULL,0,&threadID[1]);

WaitForSingleObject(hThread[0],INFINITE);
WaitForSingleObject(hThread[1],INFINITE);

CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
printf("并发修改后,gCount的值为%dn",gCount);

return 0;

}

解决方案

应该是线程安全问题。

解决方案二:

//线程
#if 1
#include
#include
#include
using namespace std;

//声明关键段(临界区)
CRITICAL_SECTION g_csNumber;

//gCount是全局共享变量,volatile表明不进行优化
volatile unsigned int gCount = 5;

unsigned __stdcall FirstThreadFunc(void *pArguments)
{
//进入临界区
//g_csNumber的成员OwningThread代表哪个线程
//拥有临界区,如果OwningThread为NULL,
//则当前线程进入临界区
//如果不为空并当和前线程ID
//不相等则等待
EnterCriticalSection(&g_csNumber);

int i;
for (i = 0; i<10000000; i++)
{
    gCount = gCount + 1;
}

//离开临界区
LeaveCriticalSection(&g_csNumber);
Sleep(50);

return 0;

}
unsigned __stdcall SecondThreadFunc(void *pArguments)
{
//进入临界区
//g_csNumber的成员OwningThread代表哪个线程
//拥有临界区,如果OwningThread为NULL,
//则当前线程进入临界区
//如果不为空并当和前线程ID
//不相等则等待
EnterCriticalSection(&g_csNumber);

int i;
for (i = 0; i<10000000; i++)
{
    gCount = gCount - 1;
}

//离开临界区
LeaveCriticalSection(&g_csNumber);
return 0;

}
int main()
{
HANDLE hThread[2];
unsigned threadID[2];
printf("gCount的初始值为%dn", gCount);

//初始化临界区
InitializeCriticalSection(&g_csNumber);

hThread[0] = (HANDLE)_beginthreadex(NULL, 0, FirstThreadFunc, NULL, 0, &threadID[0]);  //第5个参数,0为运行状态,CREATE_SUSPENDED为挂起状态,阻塞
hThread[1] = (HANDLE)_beginthreadex(NULL, 0, SecondThreadFunc, NULL, 0, &threadID[1]); //第5个参数,0为运行状态,CREATE_SUSPENDED为挂起状态,阻塞

WaitForSingleObject(hThread[0], INFINITE);  //若为零则不等待,也就不会输出子线程函数里面的内容
WaitForSingleObject(hThread[1], INFINITE);  //若为零则不等待,也就不会输出子线程函数里面的内容

CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
printf("并发修改后,gCount的值为%dn", gCount);

return 0;

}
#endif

以上是我的代码,我加了临界区,保证线程互斥,也就是说在线程一给全局变量加的时候,保证线程二不能够对全局变量进行访问,直到线程一访问完之后,才可以,你还是没有理解多线程问题。

时间: 2024-12-23 18:26:26

c语言多线程运行后为什么值会变成这样的相关文章

为什么这段c语言代码运行后会崩溃?关于strtok函数

问题描述 为什么这段c语言代码运行后会崩溃?关于strtok函数 #include #include //strtok int main() { char *arry = "i love you China"; char *token = strtok( arry, " "); while( token != NULL) { printf("%s", token); token = strtok( NULL, " "); }

c语言编程-这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么

问题描述 这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么 #include#define MAXLINE 1000int getline(char line[]int maxline);void copy(char to[]char from[]);main(){int len;int max;char line[MAXLINE];char longest[MAXLINE];max = 0;while ((len = getline(lineMAXLINE))>0)i

单词计数-为啥c语言程序运行数据输入后回车无效

问题描述 为啥c语言程序运行数据输入后回车无效 #include int main() { int ch,i,count=0,flag=0; char bb[1000]; printf("please input some words:"); gets(bb); ch=bb[i]; for(i=0;ch!='';i++) { if(ch==' ') flag=0; else if(flag==0) { count++; flag=1; } } printf("单词个数为%d&

c#-C#注册界面运行后错误提示(查询值的数目与目标字段中的数目不同。)

问题描述 C#注册界面运行后错误提示(查询值的数目与目标字段中的数目不同.) private void button1_Click(object sender, EventArgs e) { string a = textBox1.Text; string b = textBox2.Text; string c = textBox3.Text; string d = textBox4.Text; OleDbCommand cmd = new OleDbCommand(@"insert into

gpu c语言-关于gpu计算后所得值的情况

问题描述 关于gpu计算后所得值的情况 一组数据在gpu上计算,在什么情况下得到的结果没有值,画出来的图的色标上没有任何值.求解 解决方案 算出来的数据格式不对,或者是错误数据? 解决方案二: 把坐标数据输出下看看正确不正确,还有你得到的是什么值 解决方案三: 把坐标数据输出下看看正确不正确,还有你得到的是什么值

语言 1 # 00-C运行后老是结果等于-1.#IND00是怎么回事

问题描述 C运行后老是结果等于-1.#IND00是怎么回事 我的题目是一个流体力学sod激波管问题,运行后结果都是-1.#IND00,还请各位大神指教啊 我程序源代码是: #include #include float dx=1.0/100,e=0.01,r=1.4; float a_1=-2/(30*dx),a_2=-5*a_1+1/(12*dx),a_3=10*a_1-2/(3*dx),a_4=-10*a_1,a_5=5*a_1+2/(3*dx),a_6=-a_1-1/(12*dx); fl

linux下C语言多线程编程实例

linux下C语言多线程编程实例 学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵. 下面先来一个实例.我们通过创建两个线程来实现对一个数的递加. 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉. 下面是我们的代码: /*thread_example.c : c multiple thread programming in linux *author : falcon *E-mail : tunzhj03@st.lzu.edu.cn

C语言多线程编程

原文:C语言多线程编程 注:本文内容来源于互联网,感谢作者整理! Windows的多线程编程 c语言 在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使用API函数CreateThread创建线程时,其中的线程函数原型:  DWORD WINAPI ThreadProc(LPVOID lpParameter);在线程函数返回后,其返回值用作调用Ex

Linux下C语言多线程,网络通信简单聊天程序

原文:Linux下C语言多线程,网络通信简单聊天程序 功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天.但至今没想出合适的退出机制,除了用Ctr+C.出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端.应用select函数来实现异步的读写操作. 先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受"连接"请求,然后调用创建线程函数,创造新的线程,进入下一个循环.这样每当有一个新的"连接"被