模拟多任务多线程程序

最简单的操作系统

#include
“stdio.h”

 
 

int main()

{

    while(1)

    {

        ;

    }

return 0;

}

实现一个程序

#include
“stdio.h”

#include
“stdlib.h”

 
 

//计算y=3×2+7abx+c

 
 

const
unsigned
char a = 9;

const
unsigned
char b = 7;

const
unsigned
char c = 18;

 
 

int main()

{

    bool isTask_1_Living = 1;//任务标志位

 
 

    unsigned
int x;

    unsigned
long y, z;

 
 

    while(1)

    {

        if(isTask_1_Living)

        {

            x = rand();

            y = 3;

            y *= x;

            y *= x;

            z = 7;

            z *= a;

            z *= b;

            z *= x;

            y += z;

            y += c;

            isTask_1_Living = 0;

            printf(“%d”, y);

        }

    }

return 0;

}

把任务分成多个线程

#include
“stdio.h”

#include
“stdlib.h”

 
 

//计算y=3×2+7abx+c

 
 

const
unsigned
char a = 9;

const
unsigned
char b = 7;

const
unsigned
char c = 18;

 
 

int main()

{

    bool isTask_1_Living = 1;//任务标志位

    unsigned
char Task1_Thread_Progress = 0;//
划分线程

 
 

    unsigned
int x;

    unsigned
long y, z;

 
 

    while(1)

    {

        if(isTask_1_Living)

        {

            switch (Task1_Thread_Progress)

            {

                case 0:

                    x = rand();

                    y = 3;

                    break;

                case 1:

                    y *= x;

                    y *= x;

                    break;

                case 2:

                    z = 7;

                    z *= a;

                    break;

                case 3:

                    z *= b;

                    z *= x;

                    break;

                case 4:

                    y += z;

                    y += c;

                    isTask_1_Living = 0;

                    printf(“%d”, y);

                    break;

            }

            Task1_Thread_Progress++;

            if(Task1_Thread_Progress>4)

            {

                Task1_Thread_Progress = 0;

            }            

        }

    }

return 0;

}

多任务

#include
“stdio.h”

#include
“stdlib.h”

 
 

//计算y1=3×12+7a1b1x+c1

//计算y2=3×22+7a2b2x+c2

 
 

const
unsigned
char a1 = 9;

const
unsigned
char b1 = 7;

const
unsigned
char c1 = 18;

 
 

const
unsigned
char a2 = 4;

const
unsigned
char b2 = 13;

const
unsigned
char c2 = 6;

 
 

int main()

{

    bool isTask_1_Living = 1;//任务1标志位

    unsigned
char Task1_Thread_Progress = 0;//
划分线程

 
 

    bool isTask_2_Living = 1;//任务2标志位

    unsigned
char Task2_Thread_Progress = 0;//
划分线程

 
 

    unsigned
int x1;

    unsigned
long y1, z1;

 
 

    unsigned
int x2;

    unsigned
long y2, z2;

 
 

 
 

    while(1)

    {

        if(isTask_1_Living)

        {

            switch (Task1_Thread_Progress)

            {

                case 0:

                    x1 = 1;// rand();

                    y1 = 3;

                    break;

                case 1:

                    y1 *= x1;

                    y1 *= x1;

                    break;

                case 2:

                    z1 = 7;

                    z1 *= a1;

                    break;

                case 3:

                    z1 *= b1;

                    z1 *= x1;

                    break;

                case 4:

                    y1 += z1;

                    y1 += c1;

                    isTask_1_Living = 0;

                    printf(“%d\n”, y1);

                    break;

            }

            Task1_Thread_Progress++;

            if(Task1_Thread_Progress>4)

            {

                Task1_Thread_Progress = 0;

            }            

        }

        if (isTask_2_Living)

        {

            switch (Task2_Thread_Progress)

            {

            case 0:

                x2 = 1;// rand();

                y2 = 3;

                break;

            case 1:

                y2 *= x2;

                y2 *= x2;

                break;

            case 2:

                z2 = 7;

                z2 *= a2;

                break;

            case 3:

                z2 *= b2;

                z2 *= x2;

                break;

            case 4:

                y2 += z2;

                y2 += c2;

                isTask_2_Living = 0;

                printf(“%d\n”, y2);

                break;

            }

            Task2_Thread_Progress++;

            if (Task2_Thread_Progress>4)

            {

                Task2_Thread_Progress = 0;

            }

        }

    }

return 0;

}

数据代码分离

#include
“stdio.h”

#include
“stdlib.h”

 
 

//计算y1=3×12+7a1b1x+c1

//计算y2=3×22+7a2b2x+c2

 
 

struct
_coefficient

{

    unsigned
int a;

    unsigned
int b;

    unsigned
int c;

};

struct
_variable

{

    unsigned
int x;

    unsigned
int y;

    unsigned
int z;

};

struct
myTask

{

    _coefficient CO;

    _variable V;

 
 

};

 
 

//线程常量定义

#define
THREAD_OVER -1            //
线程结束

#define
THREAD_NOTOVER 0        //
线程未结束

 
 

char myThread(myTask* Task,unsigned
char *Process)

{

    char ret = 0;

 
 

    switch (*Process)

    {

        case 0:

            (*Task).V.x = 1;// rand();

            (*Task).V.y = 3;

            break;

        case 1:

            (*Task).V.y *= (*Task).V.x;

            (*Task).V.y *= (*Task).V.x;

            break;

        case 2:

            (*Task).V.z = 7;

            (*Task).V.z *= (*Task).CO.a;

            break;

        case 3:

            (*Task).V.z *= (*Task).CO.b;

            (*Task).V.z *= (*Task).V.x;

            break;

        case 4:

            (*Task).V.y += (*Task).V.z;

            (*Task).V.y += (*Task).CO.c;

            printf(“%d\n”, (*Task).V.y);

            break;

    }

    (*Process)++;

    if (*Process>4)

    {

        ret = -1;//线程结束

        *Process = 0;

    }

    return ret;

}

 
 

//定义任务

myTask Task1, Task2;

 
 

void InitTask(myTask *Task,unsigned
char
a1,unsigned
char
b1,unsigned
char
c1)

{

    (*Task).CO.a = a1;

    (*Task).CO.b = b1;

    (*Task).CO.c = c1;

}

 
 

int main()

{

    bool isTask_1_Living = 1;//任务1标志位

    unsigned
char Task1_Thread_Progress = 0;//
划分线程

 
 

    bool isTask_2_Living = 1;//任务2标志位

    unsigned
char Task2_Thread_Progress = 0;//
划分线程

 
 

    InitTask(&Task1, 9, 7, 18);

    InitTask(&Task2, 4, 13, 16);

 
 

    //printf(“%d\n”,Task1.CO.a);

 
 

    while(1)

    {

        if(isTask_1_Living)

        {

            isTask_1_Living = !myThread(&Task1,&Task1_Thread_Progress);

        }

        if (isTask_2_Living)

        {

            isTask_2_Living = !myThread(&Task2, &Task2_Thread_Progress);

        }

    }

 
 

return 0;

}

线程的另一种生死

#include
“stdio.h”

#include
“stdlib.h”

 
 

//计算y1=3×12+7a1b1x+c1

//计算y2=3×22+7a2b2x+c2

//计算y3=3×32+7a3b3x+c3

struct
_coefficient

{

    unsigned
int a;

    unsigned
int b;

    unsigned
int c;

};

struct
_variable

{

    unsigned
int x;

    unsigned
int y;

    unsigned
int z;

};

struct
myTask

{

    _coefficient CO;

    _variable V;

 
 

};

 
 

//线程常量定义

#define
THREAD_OVER -1            //
线程结束

#define
THREAD_NOTOVER 0        //
线程未结束

 
 

char myThread(myTask* Task,unsigned
char *Process)

{

    char ret = 0;

 
 

    switch (*Process)

    {

        case 0:

            (*Task).V.x = 1;// rand();

            (*Task).V.y = 3;

            break;

        case 1:

            (*Task).V.y *= (*Task).V.x;

            (*Task).V.y *= (*Task).V.x;

            break;

        case 2:

            (*Task).V.z = 7;

            (*Task).V.z *= (*Task).CO.a;

            break;

        case 3:

            (*Task).V.z *= (*Task).CO.b;

            (*Task).V.z *= (*Task).V.x;

            break;

        case 4:

            (*Task).V.y += (*Task).V.z;

            (*Task).V.y += (*Task).CO.c;

            printf(“%d\n”, (*Task).V.y);

            break;

    }

    (*Process)++;

    if (*Process>4)

    {

        ret = -1;//线程结束

        *Process = 0;

    }

    return ret;

}

 
 

//定义任务

myTask Task1, Task2, Task3;

 
 

void InitTask(myTask *Task,unsigned
char
a1,unsigned
char
b1,unsigned
char
c1)

{

    (*Task).CO.a = a1;

    (*Task).CO.b = b1;

    (*Task).CO.c = c1;

}

 
 

int main()

{

    bool isTask_1_Living = 1;//任务1标志位

    unsigned
char Task1_Thread_Progress = 0;//
划分线程

 
 

    bool isTask_2_Living = 1;//任务2标志位

    unsigned
char Task2_Thread_Progress = 0;//
划分线程

 
 

    unsigned isTask_3_Living = 5;//任务3标志位

    unsigned
char Task3_Thread_Progress = 0;//
划分线程

 
 

    InitTask(&Task1, 9, 7, 18);

    InitTask(&Task2, 4, 13, 16);

    InitTask(&Task3, 2, 24, 3);

 
 

    //printf(“%d\n”,Task1.CO.a);

 
 

    while(1)

    {

        if(isTask_1_Living)

        {

            isTask_1_Living = !myThread(&Task1,&Task1_Thread_Progress);

        }

        if (isTask_2_Living)

        {

            isTask_2_Living = !myThread(&Task2, &Task2_Thread_Progress);

        }

        if (isTask_3_Living)//程序会执行五次

        {

            isTask_3_Living +=myThread(&Task3, &Task3_Thread_Progress);

        }

    }

 
 

return 0;

}

 
 

 
 

 
 

 
 

 
 

 
 

  

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注