[高分,急]C语言,如何实现多线程,有具体方案,请提供!

C语言,如何实现多线程,有具体方案,请提供!

请详细说明,
但是,大段进行网络文档拷贝的不要。
诸位老大们,不是使用现有库函数,不是使用C++,
是做一个C语言设计的多线程的实现的方案。

我也不是一个菜鸟了,工作3年了,所以就提供方案就可以,建议使用其他语言的,各位好意在下心领了......

“希声和寡”,你太牛了,你是不是就是做这个的?或者是研究这个的?我又发了几个细节的确认给你,盼答复......

再看看有没有更好的方案,最迟明天给分。

你这个问题可是超过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可以通过时间片轮循的方式进行多任务实现

暂时就想到这么多,有不明白的通过消息进一步交流吧:)
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-09
这是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 ); //主线程执行到此处,关闭子线程句柄
}
}
第2个回答  2008-12-10
_beginthread,_beginthreadex
千万不要用CreateThread,你会后悔的
第3个回答  2008-12-09
不懂

[高分,急]C语言,如何实现多线程,有具体方案,请提供!
1. 通过C的临界域(critical section)结合PV操作来实现某些Task的原子性处理要求。2. 通过Signal来实现中断和再开 3. 如果需要处理中断和再开的话,一定要注意现场保护 4. 同优先级的Task可以通过时间片轮循的方式进行多任务实现 暂时就想到这么多,有不明白的通过消息进一步交流吧:)...

c语言如何实现多线程同时运行
C语言可以通过使用多线程库实现多线程同时运行。C语言本身并没有内置的多线程支持,但可以通过使用POSIX线程等第三方库来实现多线程编程。以下是对该过程的 1. 引入pthreads库:要使用多线程,首先需要安装并引入pthreads库。这个库提供了创建和管理线程所需的函数和机制。2. 创建线程:使用`pthread_creat...

c语言如何实现多线程同时运行
一、引入线程库 在C语言中实现多线程,首先需要引入相关的线程库。常见的线程库有pthreads库,它是可移植的,可以在多种操作系统上运行。通过包含对应的头文件,我们可以使用其中的函数来创建和管理线程。二、创建线程 在引入了线程库之后,我们需要创建线程。可以使用pthread_create函数来创建一个新的线程。

C语言如何实现多线程同时运行
要实现C语言的多线程同时运行,首先打开项目设置。在菜单栏中选择"Project"选项,向下拉选择"Project options...",这是对项目属性进行配置的地方。接下来,进入对话框并切换到"Compiler"选项卡。在这里,重要一步是更改"Runtime Library"设置,将其更改为"Multithreaded (LIB)",这有助于支持多线程编程。

C语言如何实现多线程同时运行
1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。2、选择弹出对话框中的“Compiler”选项卡。3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这...

C语言如何实现多线程同时运行
一般情况下,工作线程是处理后台工作的。创建一个线程需要两步:1、实线线程函数和开始线程,不需要由CWinThread派生类。2、可以不加修改地使用CWinThread。AfxBeginThread有两种形式,一种是用来创建用户界面线程的,另一种就是用来创建工作线程的.为了开始执行线程,只需要向AfxBeginThread提供一定的参数即可...

用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数...
1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()...

C语言基础网络编程求助 如何实现多线程
\/\/线程 pthread_t id;pthread_attr_t attr;pthread_attr_init(&attr);\/\/\/ pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);\/\/创建地址 bzero(&server_addr,sizeof(server_addr));server_addr.sin_family =AF_INET;server_addr.sin_port = htons(5555);server_addr.sin_addr.s_...

贪食蛇游戏,c语言怎么实现多线程, 高悬赏
主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join();t2.join();就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子 ...

C语言中 怎么实现双线程 或者 父子线程啊
首先指出,线程与线程之间,是并列关系,不会存在"父子线程"的概念.在Windows平台下,CreateThread函数包含在 Windows.h 文件内,包含此文件即可正常使用.以下为CreateThread函数的声明:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,\/\/指向安全性属性描述结构体的 \/\/指针,通常可以忽略的.SIZE_T dw...

相似回答