发布网友 发布时间:2022-04-23 08:29
共4个回答
热心网友 时间:2022-06-18 09:47
你这个问题可是超过200分的啊,
这个往大了说是一个比较复杂的设计方案。
实际上C语言是没有多线程的概念的,但是我们可以通过Task来实现多任务。
简单的说,可以采取以下方案:
定义一个主Task,将其置为常驻Task,用以进行Task调度和Task的启动/终了和交互的管理。
定义一个Task优先级列表,用优先级来作为Task调度和管理的基础。
定义一个共享域,和相应的事件分发/广播/传递的管理机制,由主Task来实现各Task间的事件传递。
定义3个List,实现Active,Ready,Dead的Task的管理和调度。
定义各普通Task,包含Task基本信息:Task的栈指针,Task情报,Task存储空间大小,Task的优先级,Task的事件列表(定义可以接收/发送的事件,以及可以排队的事件的个数),以及如果需要的话可以定义Task的从属(父子)关系。
另外还有几个注意点:
1. 通过C的临界域(critical section)结合PV操作来实现某些Task的原子性处理要求。
2. 通过Signal来实现中断和再开
3. 如果需要处理中断和再开的话,一定要注意现场保护
4. 同优先级的Task可以通过时间片轮循的方式进行多任务实现
暂时就想到这么多,有不明白的通过消息进一步交流吧:)
热心网友 时间:2022-06-18 09:47
这是Windows上的实现,主要是使用
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性指针
SIZE_T dwStackSize, // 初始堆栈大小
LPTHREAD_START_ROUTINE lpStartAddress, // 线程函数
LPVOID lpParameter, // 线程参数
DWORD dwCreationFlags, // 创建选项
LPDWORD lpThreadId // 线程标识符
);
函数,示例代码如下:
#include <windows.h> //包含了CreateThread函数的声明
#include <conio.h> //控制台相关输入输出函数的声明
DWORD WINAPI ThreadFunc( LPVOID lpParam ) //新线程将从这里开始执行
{
char szMsg[80];
//以下语句是在另一个线程中执行的,因此并不会因为主线程
//main函数的_getch()而挂起
wsprintf( szMsg, "Parameter = %d.", *(DWORD*)lpParam );
MessageBox( NULL, szMsg, "ThreadFunc", MB_OK );
return 0;
}
VOID main( VOID )
{
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
char szMsg[80];
hThread = CreateThread(
NULL, // 安全属性为空
0, // 使用默认堆栈大小
ThreadFunc, // 在main之前声明的线程入口
&dwThrdParam, // ThreadFunc函数的参数
0, // 使用默认线程创建标志
&dwThreadId); // 该线程的标识符将储存于dwThreadId中
// 根据CreateThread的返回值判断线程创建是否成功.
if (hThread == NULL)
{
wsprintf( szMsg, "CreateThread failed." );
MessageBox( NULL, szMsg, "main", MB_OK );
}
else
{
_getch();//主线程暂停在此处,直到用户有输入动作
CloseHandle( hThread ); //主线程执行到此处,关闭子线程句柄
}
}
热心网友 时间:2022-06-18 09:47
_beginthread,_beginthreadex
千万不要用CreateThread,你会后悔的
热心网友 时间:2022-06-18 09:48
不懂