×

c语言实现多线程技术_c语言多线程

前端技术网 前端技术网 发表于2024-01-23 10:48:15 浏览2078 评论0

抢沙发发表评论

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

你这个问题可是超过200分的啊,

这个往大了说是一个比较复杂的设计方案。

c语言实现多线程技术_c语言多线程

实际上C语言是没有多线程的概念的,但是我们可以通过Task来实现多任务。

简单的说,可以采取以下方案:

定义一个主Task,将其置为常驻Task,用以进行Task调度和Task的启动/终了和交互的管理。

定义一个Task优先级列表,用优先级来作为Task调度和管理的基础。

定义一个共享域,和相应的事件分发/广播/传递的管理机制,由主Task来实现各Task间的事件传递。

定义3个List,实现Active,Ready,Dead的Task的管理和调度。

c语言实现多线程技术_c语言多线程

定义各普通Task,包含Task基本信息:Task的栈指针,Task情报,Task存储空间大小,Task的优先级,Task的事件列表(定义可以接收/发送的事件,以及可以排队的事件的个数),以及如果需要的话可以定义Task的从属(父子)关系。

另外还有几个注意点:

1.通过C的临界域(critical section)结合PV操作来实现某些Task的原子性处理要求。

2.通过Signal来实现中断和再开

3.如果需要处理中断和再开的话,一定要注意现场保护

4.同优先级的Task可以通过时间片轮循的方式进行多任务实现

暂时就想到这么多,有不明白的通过消息进一步交流吧:)

二、C语言如何实现多线程同时运行

1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。

2、选择弹出对话框中的“Compiler”选项卡。

3、将其中的“Runtime Library”的选择改为“Multithreaded(LIB)”。

4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。

5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。

三、C语言可以实现 中断 和 多线程 这类功能吗

“晕,C语言不是灰常强大,无所不能吗?怎么有人说C语言不能实现中断和多线程??”这句话要分两部分来说,首先“晕,C语言不是灰常强大,无所不能吗?”。没有任何一种语言可以无所不能,原因很简单,任何的语言都脱离不了编译工具,而编译工具脱离不了编译环境。由于编译环境的不同,因此编译工具也有所不同,有得只针对JAVA,有得指针对C++,有得只针对C#。不管C语言多厉害,如果编译工具不支持,那也没有办法在这个编译工具上编译,以至于没有办法在那个编译工具的编译环境中运行。所以不能说无所不能。

“怎么有人说C语言不能实现中断和多线程啊”,这是一个概念性问题。纯粹的C语言只是一个工具,更多的是一种定义,一种格式,可以抽象成一种风格。就像定义一个整型变量i。为什么你不能用integer i定义,非得int i。例如函数的编写形式,命名规则等等。假如按照C语言的这些规则来编写程序,同时编译工具支持C语言,提供中断库,还有多线程库,那么C语言同样也可以实现中断和多线程。举个例子:例如你手头上只有一个TC编译工具,虽然他支持C语言,但是只能编译16位的DOS程序,碍于这个编译工具的局限性,所以你永远也写不出像Windows操作系统那种带窗口界面的Win32程序,也不能写一个针对.NET框架的网络服务程序。同样的,假如你要开发一个Windows软件,使用VC编译器,而这个编译工具本身带多线程库,同时支持Windows系统的很多调用,所以你完全可以以C语言的风格在这个编译器中调用各种Win32 SDK,开发一个多线程的Windows应用程序。假如你要使用中断,在Windows环境下可以使用微软提供的DDK(驱动开发包),他同样支持C语言,那么你就可以通过这个开发包调用很多中断。在Linux环境下,不需要开发包就可以直接调用,因为Linux自带了很多系统调用都是开放的。头文件声明直接就在Linux文件系统的Sys目录下。所以说他仅仅是一种风格。依赖于编译环境的系统调用同样也依赖于编译环境提供的链接库。

四、c语言实现多线程

目录:

Linux操作系统,C语言实现多线程

Windows操作系统,C语言实现多线程

Windows下的多线程(不带停止)

Linux操作系统,C语言实现多线程:

#include<stdio.h>

#include<stdlib.h>

#include<pthread.h>

void*ThreadOne(void*threadArg)

{

printf("线程开始啦,参数是:%s\n",(char*)threadArg);

returnNULL;

}

intmain(void)

{

pthread_tThreadID;/*记录线程标识符*/

void*waitingResult;/*等待线程退出的等待结果*/

interrorCode;/*记录线程的错误代码*/

char*aMessage="这是线程的参数";

/*创建并启动线程ThreadOne。若返回值非零,则线程创建失败*/

errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);

if(errorCode!=0)

{

printf("线程ThreadOne创建失败。错误代码:%d\n",errorCode);

returnEXIT_FAILURE;

}

/*等待线程标识符为的ThreadID的线程结束*/

errorCode=pthread_join(ThreadID,&waitingResult);

if(errorCode!=0)

{

printf("等待线程退出等待失败。错误代码:%d\n",errorCode);

returnEXIT_FAILURE;

}

printf("线程的返回值是%p\n",waitingResult);

returnEXIT_SUCCESS;

}Windows操作系统,C语言实现多线程:

#include<stdio.h>

#include<windows.h>

DWORDAPIENTRYThreadOne(LPVOIDthreadArg)

{

printf("线程开始啦,参数是:%s\n",(char*)threadArg);

return0;

}

intmain(void)

{

HANDLEhThread;/*记录线程句柄*/

DWORDThreadID;/*记录线程ID号*/

DWORDwaitingResult;/*等待线程退出的等待结果*/

DWORDthreadExitCode;/*记录线程的返回值*/

char*aMessage="这是线程的参数";

/*创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread*/

hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);

if(hThread==NULL)

{

printf("线程ThreadOne创建失败。错误代码:%lu\n",GetLastError());

returnEXIT_FAILURE;

}

/*等待线程句柄为的hThread线程结束*/

waitingResult=WaitForSingleObject(hThread,INFINITE);

if(waitingResult==WAIT_FAILED)

{

printf("等待线程退出等待失败。错误代码:%lu\n",GetLastError());

returnEXIT_FAILURE;

}

if(GetExitCodeThread(hThread,&threadExitCode))

printf("线程的返回值是%lu\n",threadExitCode);

else

printf("获取线程的返回值获取失败。错误代码:%lu\n",GetLastError());

returnEXIT_SUCCESS;

}Windows下的多线程:(不带停止)

#include<stdio.h>

#include<windows.h>

DWORDWINAPIduoxianchen(LPVOIDlpParam);

intmain(intargc,char*argv[])

{

intnum=0;

CreateThread(NULL,NULL,duoxianchen,&num,NULL,NULL);

while(1)

{

num++;

printf("主线程!%05d\n",nu***eep(40);

}

return0;

}

DWORDWINAPIduoxianchen(LPVOIDlpParam)

{

int*a=lpParam;

while(1)

{

++*a;

printf("副线程!%05d0x%p\n",*a,a);

Sleep(80);

}

return0;

}

关于本次c语言实现多线程技术_c语言多线程和c语言实现多线程的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。