创建第一个线程

来源:互联网 发布:js贪吃蛇 编辑:程序博客网 时间:2024/06/05 18:39

教程来自阿发学院《百度传课》

引例:

两个对象无法同时干活,函数调用是串行的,只有一个函数返回后,才往下执行下一个函数;

#include <stdio.h>void Buddhist(){for (int i = 0;i < 100;i++){printf("和尚%d \n",i);}}void Confucian(){for (int i = 0;i < 100;i++){printf("秀才%d \n",i);}}int main(){Buddhist(); //先循环100次Confucian();//再循环100次return 0;}

如何让两个并行同步循环呢?各干各的,互不干扰?

 线程:用于实现并发的任务,让多个任务可以同时运行。(各个任务放在各自的线程中运行)

  但是只有一个icpu,所以就需要线程调度:

(1)所以每个线程都要自觉地让出cpu,让别的线程也有机会被运行,使用Sleep()

  (2) 操作系统把时间分割成很细的小片,让每个线程都有机会运行几毫秒,轮流运行。

#include <stdio.h>#include "osapi/osapi.h"//定义一个类class MyTask :public OS_Thread{private:virtual int Routine(){//线程体:执行它的任务;for (int i = 0;i < 100; i++){printf("TASK== %d\n", i);OS_Thread::Sleep(1);}return 0;}};class MyTask2 :public OS_Thread{private:virtual int Routine(){//线程体:执行它的任务;for (int i = 0;i < 100; i++){printf("TASK++%d\n", i);OS_Thread::Sleep(1);}return 0;}};int main(){MyTask task;task.Run();MyTask2 task2;task2.Run();printf("+++++++主线程可以开始独立干活+++++++++++++\n");for (int i = 0;i < 10;i++){printf("Main!!!Main\n");OS_Thread::Sleep(1);}getchar();return 0;}

main退出时,程序将结束!

task.Run()//这是创建线程

task.Routine();//这是函数调用

区别:创建线程由OS完成,它创建一个线程实体,该线程的主函数时ROutine(); 即线程的入口!!

线程的停止:

int Routine()

{

printf("++++++++++\n");

return 0 ;  // 线程结束!!

}

线程的正常终止:

1:设置flag ,

2:在线程中设置检测flag;

3.:等待线程退出


#include <stdio.h>#include "osapi/osapi.h"//定义一个类class MyTask2 :public OS_Thread{private:virtual int Routine(){//线程体:执行它的任务;for (int i = 0;!m_quitflag && i < 100; i++){printf("TASK++%d\n", i);OS_Thread::Sleep(1);}printf("Normally exit. \n");//保存善后工作F******printf("善后工作!");return 0;}public:bool m_quitflag;};int main(){MyTask2 task;task.m_quitflag = false;task.Run();getchar();task.m_quitflag = true;OS_Thread::Join(&task); //等待线程退出,给予时间,处理善后工作!!回收线程的相关系统资源system("pause");return 0;}

访问共享数据

#include <stdio.h>#include "osapi/osapi.h"//数据的完整性://定一个数组,数组的每个元素都相等,否则视为不完整的。char g_key[16];//定义两个线程//KeyGenerator :定时生成key/更新key//KeyChecker: 获取Key,检查其完整性
OS_mutex g_mutex;class KeyGenerator : public OS_Thread{private:virtual int Routine(){int times = 0;while (1){//更新keyfor (int i = 0; i < 16; i++){g_key[i] = times;OS_Thread::Msleep(50);}times++;if (times >= 128) times = 0;OS_Thread::Msleep(50);}return 0;}};class KeyChecker : public OS_Thread{private:void printKey(){printf("Key: ");for (int i = 0; i < 16; i++)printf("%02x", g_key[i]);printf("\n");}virtual int Routine(){while (1){printKey();//检查完整性for (int i = 0; i < 16; i++){OS_Thread::Msleep(5);if (g_key[i] != g_key[i - 1]){printf("不完整!!\n");printKey();return 0;}elseprintf("OK!!");OS_Thread::Msleep(50);}return 0;//正常退出};};};int main(){KeyGenerator kg;kg.Run();KeyChecker kc;kc.Run();getchar();system("pause");return 0;}


互斥锁:

mutex

使用:

在访问共享数据之前,先获取 锁;

在访问完毕后,释放锁

机制:

在一个线程获取锁 locked之后,另一个线程的lock操作会一直等待(阻塞状态),直到改锁 被释放(Unlocked);