Win10和Win7对线程的处理机制不一样了吗?

偕臧x
博客专家认证
2017-11-20 06:44:46
Win10和Win7对线程的处理机制不一样了吗?
windows线程
最近刚开始接触windows程序设计,然后分别在Win10的VS2017运行和Win7的VC6.0
运行同一段代码,但是结果却大不一样?
这段代码是关于,设置啷个不同的优先级进程(一个空闲,一个正常),然后来进行运行,就发现了结果不同???
对此十分不理解。希望有大牛可以解答一下大三狗的困惑!
有人可以解答一下吗,? 在这里谢过了。
运行结果:
Win10 VS2017环境:

win7 VC6.0环境

然后下面是代码:

// 两个优先级不同的线程.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

DWORD WINAPI ThreadIdle(LPVOID lpParam); //设置空闲线程
DWORD WINAPI ThreadNormal(LPVOID lpParam); //设置正常线程



int main()
{
DWORD dwThreadID;
HANDLE h[2];

//创建线程(优先级为空闲的)
h[0] = CreateThread(NULL, 0, ThreadIdle, NULL, CREATE_SUSPENDED, &dwThreadID); //该线程是设置为挂起的
SetThreadPriority(h[0], THREAD_PRIORITY_IDLE); //设置线程的优先级
ResumeThread(h[0]); //线程可以开始执行


//创建线程(优先级为正常的)
h[1] = CreateThread(NULL, 0, ThreadNormal, NULL, 0, &dwThreadID);


//等待两个线程的内核对象全部变为受信状态(即:线程结束状态)
WaitForMultipleObjects(2, h, TRUE, INFINITE);


//关闭两个线程
CloseHandle(h[0]);
CloseHandle(h[1]);

return 0;
}


DWORD WINAPI ThreadIdle(LPVOID lpParam) //设置空闲线程
{
for (size_t i = 0; i < 10; i++)
{
printf("Idle Thread id runing! is:%5d\n", i);
}

return 0;
}

DWORD WINAPI ThreadNormal(LPVOID lpParam) //设置正常线程
{
for (size_t i = 0; i < 10; i++)
{
printf("Norma Thread id runing! is:%5d\n", i);
}

return 0;
}
...全文
2844 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-01-24
  • 打赏
  • 举报
回复
试试:

char prompt[80]; 
  
DWORD WINAPI ThreadIdle(LPVOID lpParam)   //设置空闲线程 
{ 
    for (int i = 0; i < 10; i++) 
    { 
        sprintf(prompt,"Idle   Thread %5d is running!\n",i);
		OutputDebugString(prompt);
//not:		printf("Idle   Thread %5d is running!\n",i);
    } 
  
    return 0; 
} 
  
DWORD WINAPI ThreadNormal(LPVOID lpParam)  //设置正常线程 
{ 
    for (int i = 0; i < 10; i++) 
    { 
        sprintf(prompt,"Normal Thread %5d is running!\n",i);
		OutputDebugString(prompt);
//not:      printf("Normal Thread %5d is running!\n",i); 
   } 
  
    return 0; 
结果: Idle Thread 0 is running! Idle Thread 1 is running! Idle Thread 2 is running! Idle Thread 3 is running! Idle Thread 4 is running! Idle Thread 5 is running! Idle Thread 6 is running! Idle Thread 7 is running! Idle Thread 8 is running! Idle Thread 9 is running! The thread 0x19D8 has exited with code 0 (0x0). Normal Thread 0 is running! Normal Thread 1 is running! Normal Thread 2 is running! Normal Thread 3 is running! Normal Thread 4 is running! Normal Thread 5 is running! Normal Thread 6 is running! Normal Thread 7 is running! Normal Thread 8 is running! Normal Thread 9 is running! The thread 0x1B20 has exited with code 0 (0x0).
schlafenhamster 2018-01-24
  • 打赏
  • 举报
回复
各加一个 Sleep(500) 看看。
Eleven 2018-01-22
  • 打赏
  • 举报
回复
这个不是WIn7和WIn10的区别,是VS2017和VC6的区别,VC6中设置/MTd 或者/MT试试
draculamx 2018-01-22
  • 打赏
  • 举报
回复
这个应该和操作系统调度有关,虽然都是windows,但是win7和win10肯定还是有区别的,而且两个线程并行,虽然你设置了不同的优先级,但是依然会交错执行,不过你这个工作线程执行的工作太短,所以也看不出个所以然,你可以试一下把任务加长一点,再看看效果
danscort2000 2018-01-17
  • 打赏
  • 举报
回复
你使用的是后台工作线程,理论上是不应该直接操作界面例如printf 这不是你代码问题 而是因为你调用了系统调用printf操作界面 而这个界面输出是个序列化的队列,如果你是双核心以上cpu 前一个线程,不管优先级多高,会等待printf 前台界面操作完成才能在线程里执行下一步操作 这时候另一个线程会得到时间片运行 因此,其实win10那个才是正常的 而vc6那个,感觉就象没打开mt编译开关,或者运行的太快了
赵4老师 2018-01-11
  • 打赏
  • 举报
回复
搜“毛德操”
大风哉 2018-01-11
  • 打赏
  • 举报
回复
引用 3 楼 qq_33154343 的回复:
[quote=引用 2 楼 赵4老师的回复:]《Windows核心编程》
可以说具体一些吗?基本还不牢固,还没到看核心编程的地步[/quote] 赵4老师这是给你指方向呢
偕臧x 2018-01-11
  • 打赏
  • 举报
回复
引用 2 楼 赵4老师的回复:
《Windows核心编程》
可以说具体一些吗?基本还不牢固,还没到看核心编程的地步
赵4老师 2017-11-21
  • 打赏
  • 举报
回复
《Windows核心编程》
开心秋水 2017-11-20
  • 打赏
  • 举报
回复
建议两个环境都使用同样的VS版本

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧