我一直有个问题弄不懂,C是不支持多线程的,Linux内核是C标准写的,那它怎么支持多线程呢?

yyxgs 2016-03-23 07:38:27
我一直有个问题弄不懂,C是不支持多线程的,Linux内核是C标准写的,那它怎么支持多线程呢?
...全文
420 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyxgs 2016-03-23
  • 打赏
  • 举报
回复
引用 3 楼 chehw_1 的回复:
多线程是操作系统的功能,这不是C语言要做的事。 C语言是用最简洁的语法来实现任意复杂的功能,包括让操作系统实现多线程支持。 “C语言本身不支持多线程,所以不能实现多线程“ 这种概念是错误的。 这就好比C语言本身虽然不支持“面向对象”和“模板”,但却可以用C来实际实现“面向对象”和“模板”。比如GTK+就是完全用C写出了“面向对象”编程的模式,包括实现类的继承;而gmp库,虽然是用C、汇编编写的,但大量使用来C方式的模板。 有些C标准库的函数在最初设计时可能不是线程安全的,这是因为在这些库最初写成的时候,还没发明出多线程的概念,由于在实现时使用了很多全局变量,加上函数声明的限制,后期也很难引入对多线程的支持。 比如rand()函数,早期使用了一个全局变量做为种子,所以该函数在多线程环境下一定是不安全的,由于该函数不附带任何参数,因此也无法简单的将其改成支持多线程。为了支持多线程,后期只能另外引入一个rand_r()函数,多传递一个参数来用于同步。 也就是说,不是C不支持多线程,而是C的标准库中的一些函数未必支持多线程。这需要C程序员在多线程编程下自己格外注意这些库函数的使用,避免因为误用了某些多线程不安全的库函数而造成不可预知的后果。
大神,学习了!
chehw_1 2016-03-23
  • 打赏
  • 举报
回复
多线程是操作系统的功能,这不是C语言要做的事。 C语言是用最简洁的语法来实现任意复杂的功能,包括让操作系统实现多线程支持。 “C语言本身不支持多线程,所以不能实现多线程“ 这种概念是错误的。 这就好比C语言本身虽然不支持“面向对象”和“模板”,但却可以用C来实际实现“面向对象”和“模板”。比如GTK+就是完全用C写出了“面向对象”编程的模式,包括实现类的继承;而gmp库,虽然是用C、汇编编写的,但大量使用来C方式的模板。 有些C标准库的函数在最初设计时可能不是线程安全的,这是因为在这些库最初写成的时候,还没发明出多线程的概念,由于在实现时使用了很多全局变量,加上函数声明的限制,后期也很难引入对多线程的支持。 比如rand()函数,早期使用了一个全局变量做为种子,所以该函数在多线程环境下一定是不安全的,由于该函数不附带任何参数,因此也无法简单的将其改成支持多线程。为了支持多线程,后期只能另外引入一个rand_r()函数,多传递一个参数来用于同步。 也就是说,不是C不支持多线程,而是C的标准库中的一些函数未必支持多线程。这需要C程序员在多线程编程下自己格外注意这些库函数的使用,避免因为误用了某些多线程不安全的库函数而造成不可预知的后果。
yyxgs 2016-03-23
  • 打赏
  • 举报
回复
引用 1 楼 qq_27479125 的回复:
线程的原理是把多个同时跑的代码段放在内核创建的一个队列中,快速的循环执行,从最底层来讲线程不可能是同步的。从应用层看一般都认为线程是同步的。应该就是这样理解吧。
哦哦,原来是这样,感谢指导!
qq_27479125 2016-03-23
  • 打赏
  • 举报
回复
线程的原理是把多个同时跑的代码段放在内核创建的一个队列中,快速的循环执行,从最底层来讲线程不可能是同步的。从应用层看一般都认为线程是同步的。应该就是这样理解吧。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧