VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 625|回复: 8

多线程问题

[复制链接]

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-19 10:00:02 | 显示全部楼层 |阅读模式
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
volatile int index=0;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int main(int argc, char* argv[])
{
       
        HANDLE hThread1;
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        while(index++<1000)
        {
                cout<<"Main thread is runing"<<endl;
        }


        return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
        while(index++<1000)
        {
                cout<<"Thread1 is running"<<endl;
        }
        return 0;
}

这个程序怎么运行出错,读错误内存
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-6-23 15:00:02 | 显示全部楼层
volatile  change to static
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-6-23 17:45:01 | 显示全部楼层
HANDLE hThread1;
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        CloseHandle(hThread1);
WaitForSingleObject(hThread1,INFINITE);
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-29 15:30:01 | 显示全部楼层
说一下是什么原因
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-6-29 22:00:02 | 显示全部楼层
ok
1,主线程和子线程同时对index进行读写操作,这是race condition,非常错误的写法,但不是出错的主要原因
2,我个人认为,主线程中的循环目的只是为了让主线程堵塞,而不会直接退出,这种写法更是错误
3。当主线程的循环结束,主线程要return了,你的子线程有可能还未退出,有可能还要访问index,而此时主线程正在释放各种变量和资源,内存读错误有可能产生

使用waitforsingleobject的目的是为了取代主线程循环的作用。他会一直等待子线程推出,才返回。index此时也只有一个线程读写,因此是正确的

你的代码对线程的使用和方式实在是犯了大忌
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-6-29 23:30:01 | 显示全部楼层
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
WaitForSingleObject(hThread1,INFINITE);
CloseHandle(hThread1);
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-30 09:45:01 | 显示全部楼层
非常感谢,刚学多线程
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-30 10:45:01 | 显示全部楼层
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
volatile static int index=0;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int main(int argc, char* argv[])
{
       
        HANDLE hThread1;
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        WaitForSingleObject(hThread1,INFINITE);
        while(index++<1000)
        {
                cout<<"Main thread is runing"<<endl;
        }


        return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
        while(index++<1000)
        {
                cout<<"Thread1 is running"<<endl;
        }
        return 0;
}
改成上面这个样子还是出错。
但是改成下面的样子却什么都输不出

// MultThread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
volatile static int index=0;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int main(int argc, char* argv[])
{
       
        HANDLE hThread1;
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        WaitForSingleObject(hThread1,INFINITE);
/*        while(index++<1000)
        {
                cout<<"Main thread is runing"<<endl;
        }
*/

        return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
        while(index++<1000)
        {
                cout<<"Thread1 is running"<<endl;
        }
        return 0;
}
多线程好晕
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-30 11:45:02 | 显示全部楼层
我搞错了。。不好意思。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表