c语言多线程编程(c语言编译器网页版)
大家好,今天来为大家分享c语言多线程编程的一些知识点,和c语言编译器网页版的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
c语言的编程开发
GCC,GNU组织开发的开源免费的编译器
MinGW,Windows操作系统下的GCC
Clang,开源的BSD协议的基于LLVM的编译器
Visual C++:: cl.exe,Microsoft VC++自带的编译器 CodeBlocks,开源免费的C/C++ IDE
CodeLite,开源、跨平台的C/C++集成开发环境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Stdio系列起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了一本书,名叫《The C Programming Language》。这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。
K&R C主要介绍了以下特色:
结构体(struct)类型
长整数(long int)类型
无符号整数(unsigned int)类型
把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i=-10还是i=- 10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最准要求,许多老旧的编译器仍然运行K&R C的标准。 1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。
1983年,美国国家标准协会(ANSI)成立了一个委员会X3J11,来制定 C语言标准。
1989年,美国国家标准协会(ANSI)通过了C语言标准,被称为ANSI X3.159-1989 Programming Language C。因为这个标准是1989年通过的,所以一般简称C89标准。有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。
1990年,国际标准化组织(ISO)和国际电工委员会(IEC)把C89标准定为C语言的国际标准,命名为ISO/IEC 9899:1990- Programming languages-- C。因为此标准是在1990年发布的,所以有些人把简称作C90标准。不过大多数人依然称之为C89标准,因为此标准与ANSI C89标准完全等同。
1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C89标准修订版,名叫ISO/IEC 9899:1990/Cor 1:1994,有些人简称为C94标准。
1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC 9899:1990/Amd 1:1995- C Integrity,有些人简称为C95标准。 1999年1月,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C语言的新标准,名叫ISO/IEC 9899:1999- Programming languages-- C,简称C99标准。这是C语言的第二个官方标准。
在C99中包括的特性有:增加了对编译器的限制,比如源程序每行要求至少支持到 4095字节,变量名函数名的要求支持到 63字节(extern要求支持到 31)。增强了预处理功能。例如:宏支持取可变参数#define Macro(...) __VA_ARGS__使用宏的时候,允许省略参数,被省略的参数会被扩展成空串。支持//开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了)增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool支持 long long, long double _Complex, float _Complex等类型支持不定长的数组,即数组长度可以在运行时决定,比如利用变量作为数组长度。声明时使用 int a[var]的形式。不过考虑到效率和实现,不定长数组不能用在全局,或 struct与 union里。变量声明不必放在语句块的开头,for语句提倡写成 for(int i=0;i<100;++i)的形式,即i只在 for语句块内部有效。允许采用(type_name){xx,xx,xx}类似于 C++的构造函数的形式构造匿名的结构体。复合字面量:初始化结构的时候允许对特定的元素赋值,形式为:
struct test{int a[3],b;} foo[]={ [0].a={1}, [1].a= 2}; struct test{int a, b, c, d;} foo={.a= 1,.c= 3, 4,.b= 5};// 3,4是对.c,.d赋值的格式化字符串中,利用 \u支持 unicode的字符。支持 16进制的浮点数的描述。 printf scanf的格式化串增加了对 long long int类型的支持。浮点数的内部数据描述支持了新标准,可以使用#pragma编译器指令指定。除了已有的 __line__ __file__以外,增加了 __func__得到当前的函数名。允许编译器化简非常数的表达式。修改了/%处理负数时的定义,这样可以给出明确的结果,例如在C89中-22/ 7=-3,-22% 7=-1,也可以-22/ 7=-4,-22% 7= 6。而C99中明确为-22/ 7=-3,-22% 7=-1,只有一种结果。取消了函数返回类型默认为 int的规定。允许 struct定义的最后一个数组不指定其长度,写做 [](flexible array member)。 const const int i将被当作 const int i处理。增加和修改了一些标准头文件,比如定义 bool的<stdbool.h>,定义一些标准长度的 int的<inttypes.h>,定义复数的<complex.h>,定义宽字符的<wctype.h>,类似于泛型的数学函数<tgmath.h>,浮点数相关的<fenv.h>。在<stdarg.h>增加了 va_copy用于复制...的参数。里增加了 struct tmx,对 struct tm做了扩展。输入输出对宽字符以及长整数等做了相应的支持。 GCC和其它一些商业编译器支持C99的大部分特性。 2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准,名叫ISO/IEC 9899:2011- Information technology-- Programming languages-- C,简称C11标准,原名C1X。这是C语言的第三个官方标准,也是C语言的最新标准。
新的标准提高了对C++的兼容性,并增加了一些新的特性。这些新特性包括:对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符, aligned_alloc函数以及<stdalign.h>头文件。 _Noreturn函数标记,类似于 gcc的 __attribute__((noreturn))。 _Generic关键字。多线程(Multithreading)支持,包括: _Thread_local存储类型标识符,<threads.h>头文件,里面包含了线程的创建和管理函数。 _Atomic类型修饰符和<stdatomic.h>头文件。增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.删除了 gets()函数,使用一个新的更安全的函数gets_s()替代。增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s()等等。增加了更多浮点处理宏。匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。静态断言(static assertions),_Static_assert(),在解释#if和#error之后被处理。新的 fopen()模式,(“…x”)。类似 POSIX中的 O_CREAT|O_EXCL,在文件锁中比较常用。新增 quick_exit()函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。
C语言 阻塞,非阻塞和多线程有什么关系
阻塞是在传统的网络编程中我们依赖于ServerSocket,Socket进行通信,大致的框架就是ServerSocket调用accept方法,等待客户端的连接,如果连接进来的时候则创建一个服务器端socket,客户端和服务器端socket建立好InputStream和outputStream通道进行通信,在这个网络IO的过程中inputStream的read和outputStream的write方法都可能发送阻塞。为了减少这种阻塞对其他连接的影响,一般都会在服务器端为每个连接开辟一个新的线程,或者使用线程池技术来避免线程的创建销毁同时又一定程度支持并发量。然而这种情况下,如果发生大量的read或者write阻塞线程池的效率会大大降低,而且操作系统也额外需要频繁的处理cpu的切换。
非阻塞式通信实际是对上述模式的扩展,它的核心思想是为传统的socket加入事件监听的功能,操作系统可以在socket和serversocket上进行事件监听,一旦监听的对象发生了连接和可读可写的事件,监听器就会对注册了事件的对象返回相应的通知。在javaNIO中实现这一套的机制就是把socket和ServerSocket重写成为SocketChanel,ServerSocketChanel,他们的底层仍然使用socket实现,所以原则上javaNIO包可以完全实现阻塞和非阻塞两种编程模式。事件监听的功能由Selection类完成,他使用select方法一直阻塞式监听注册了的事件是否发生,对于每一个发生的事件,他都会返回一个selectionKey,通过这个key我们就可以确定这个事件的发生源(socket)和相关信息。对于ServerSocketChanel,Socketchanel分别对应了不同的事件,serverChanel只有OP_ACCEPT代表是否可以接受连接,而socketChanel则有OP_CONNECT、read、write事件。笔者认为与阻塞IO相比他的优势在于可以避免read和write的阻塞,因为这个比较具有实际意义的。比如是一个网络文件传输系统,read方法可能会因为网络原因发生多次阻塞,使用非阻塞IO read的话线程可以立即返回去处理其他任务。
多线程是在进程中进一步去划分的独立单元。
C语言编程问题 高手进
如果第2点满足了,那么第3点也不需要多线程了。
估计你用的是TC编译器,这是一个很差的编译器,建议你使用VC++(window)或者gcc(Linux/Unix)两者之一。图形和多线程都是与操作系统相关的东西,单单的C语言标准库是没有这类函数的,所以,如果你真的要实现这些东西,请选译一个平台(window或Linux),深入学习。
关于你说的第2点,TC还是有办法的。即使用boiskey函数
函数原型:int bioskey(int cmd)
说明:bioskey()的函数原型在bios.h中 bioskey()完成直接键盘操作,cmd的值决定执行什么操作。
cmd= 0:
当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。
cmd= 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。
cmd= 2:
当cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert键的状态。各键状态存放在返回值的低8位字节中。字节位含义 0右边Shift键状态 1左边Shift键状态 3 Ctrl键状态 4 Alt键状态 5 ScrollLock键状态 6 NumLock键状态 7 CapsLock键状态 8 Insert
bioskey函数在游戏开发中很有用的一个函数,基本都是用它来处理用户的输入。scanf函数用来接受用户的输出入,直到用户输入后才返回。而bioskey不同的,它可以获取此时用户是否输入,如果输入,可以获取用户的输入值,只要设置函数的入口参数cmd即可。
这是我博客上的一篇文章,具体分析搬运工游戏的代码,跟你的程序结构应该是很类似的(只能在TC上编译)
好了,文章到此结束,希望可以帮助到大家。