首页 > 代码库 > 015 输入理解时间片

015 输入理解时间片

线程
  ● 线程抢占式运行
    ○ 启动两个线程
      ○ 分别在第一个线程 1 - 100
      ○ 第二个线程里面 101-200
    ○ 未知
    ○ 有一定规律的,哪个线程先抢到时间片,就先执行里面的所有代码

      ○ 谁先抢到时间片 就先运行谁的代码

 

 1 #include <windows.h>
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 
 5 DWORD WINAPI ThreadFuncNo1(LPVOID lParama)
 6 {
 7     for(int i = 1; i <= 100; ++i)
 8     {
 9         _tprintf(TEXT("No1:%d\r\n"),i);
10     }
11     return 0;
12 }
13 
14 DWORD WINAPI ThreadFuncNo2(LPVOID lParama)
15 {
16     for(int i = 101; i <= 200; ++i)
17     {
18         _tprintf(TEXT("No2:%d\r\n"),i);
19     }
20     return 0;
21 }
22 int main()
23 {
24     HANDLE hThread[2];
25     hThread[0] = CreateThread(nullptr, 0, ThreadFuncNo1, nullptr, 0, nullptr);
26     hThread[1] = CreateThread(nullptr, 0, ThreadFuncNo2, nullptr, 0, nullptr);
27     WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
28     return 0;
29 }

技术分享

 

  ● 主线程是否也会抢占CPU时间片运行呢 ?

    ○ 下面是实力代码

 1 #include <windows.h>
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 
 5 DWORD WINAPI ThreadFuncNo1(LPVOID lParama)
 6 {
 7     for(int i = 1; i <= 100; ++i)
 8     {
 9         _tprintf(TEXT("No1:%d\r\n"),i);
10     }
11     return 0;
12 }
13 
14 DWORD WINAPI ThreadFuncNo2(LPVOID lParama)
15 {
16     for(int i = 101; i <= 200; ++i)
17     {
18         _tprintf(TEXT("No2:%d\r\n"),i);
19     }
20     return 0;
21 }
22 int main()
23 {
24     HANDLE hThread[2];
25     hThread[0] = CreateThread(nullptr, 0, ThreadFuncNo1, nullptr, 0, nullptr);
26     hThread[1] = CreateThread(nullptr, 0, ThreadFuncNo2, nullptr, 0, nullptr);
27     WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
28 
29     //主线程是不是也会抢占CPU时间片运行呢?
30     for (int i = 201; i <= 300; ++i)
31     {
32         _tprintf(TEXT("No3:%d\r\n"), i);
33     }
34 
35 
36     return 0;
37 }

技术分享

 

  ● 时间片

    ○ 目前无法控制时间片

    ○ 时间片是由操作系统来管理的

 

  ● 如何让程序交叉执行

    ○ 当线程中发生阻塞的时候 ,会使得当前我们的线程休眠

    ○ 操作系统会讲它休眠的时间片提取出来,回去执行其他线程

    ○ 通过阻塞函数实现

技术分享

 

  ● 简单切换执行代码

 1 #include <windows.h>
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 
 5 enum ThreadSigln
 6 {
 7     NO1,
 8     NO2,
 9     NO3
10 };
11 ThreadSigln g_Thread_Sign;
12 
13 DWORD WINAPI ThreadFuncNo1(LPVOID lParama)
14 {
15     for(int i = 1; i <= 100; ++i)
16     {
17         while(g_Thread_Sign != NO1)
18         {
19             Sleep(1);
20         }
21         _tprintf(TEXT("No1:%d\t"),i);
22         g_Thread_Sign = NO2;
23     }
24     return 0;
25 }
26 
27 DWORD WINAPI ThreadFuncNo2(LPVOID lParama)
28 {
29     for(int i = 101; i <= 200; ++i)
30     {
31         while(g_Thread_Sign != NO2)
32         {
33             Sleep(1);
34         }
35         _tprintf(TEXT("No2:%d\t"),i);
36         g_Thread_Sign = NO3;
37     }
38     return 0;
39 }
40 int main()
41 {
42     HANDLE hThread[2];
43     hThread[0] = CreateThread(nullptr, 0, ThreadFuncNo1, nullptr, 0, nullptr);
44     hThread[1] = CreateThread(nullptr, 0, ThreadFuncNo2, nullptr, 0, nullptr);
45     //WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
46     g_Thread_Sign = NO1;
47 
48     //主线程是不是也会抢占CPU时间片运行呢?
49     for (int i = 201; i <= 300; ++i)
50     {
51         while(g_Thread_Sign != NO3)
52         {
53             Sleep(1);
54         }
55         _tprintf(TEXT("No3:%d\t\r\n"), i);
56         g_Thread_Sign = NO1;
57     }
58 
59     WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
60     return 0;
61 }

技术分享

 

015 输入理解时间片