随笔分类 - Linux C
Linux下的C编程。
摘要:以前利用linux系统提供的读写锁写过一些小程序,但是linux系统提供的读写锁是线程级的,如果是进程间的同步的话,就没那么轻松了。而且由于linux系统提供的读写锁是读优先的,在有些情况下,也不能满足我们的要求。下面就说说利用信号量来实现写优先的读写锁。 先说说原理,这个程序需要用到两个信号量,一个互斥信号量A,一个同步信号量B,其拥有MAX_RESOURCES个资源。当读进程申请读锁的时候,...
阅读全文
摘要:前段时间看了下google c/c++编程风格,摘录一些要点记载于此,还请各位指点。 为了接下来清楚的阐述googleC++编程规范,先阐述几个概念: PascalCase:当标识符由两个或者两个以上单词组成的时候,单词之间不加其他的符号,并且每个单词都必须大写,例如PascalCase。 camelCase:当标识符由两个或者两个以上单词组成的时候,单词间不加其他的符号,并且第一个单词以小...
阅读全文
摘要:在上篇博文《线程并发执行带来的问题》的评论中,有几个朋友(锦瑟无端五十弦、Kevin-moon等)说到了要用volatile声明变量的问题,首先非常感谢他们的指点。以前一直只知道volatile关键字是通知编译器在对这个变量进行操作的时候,每次都从其内存中读取数据,不要对其进行优化,但对其具体的过程不了解。今天看一篇文章《汇编与C之间的关系》,恰好提到这个问题,于是就将其记录下来,还请您多多指教。...
阅读全文
摘要:线程并发会引发一些难以发现的错误,现在就来看一个简单的线程的并发导致的问题,首先来看下面程序,程序很简单,就是创建了3个线程,第一个线程对i和count加1,第二个线程对j和count加1,第三个线程对k和count加1,i,j,k,count初始化都为0,这样的华,按照逻辑来说,最后i+j+k = count:[代码]在我机子上执行的结果是:i = 92394160, j = 55544601,...
阅读全文
摘要:这个程序是前段时间学习线程间同步的时候写的,利用读写锁来实现的(我感觉读写锁就是专门为这类问题而生的):[代码]看看读写锁的结构体定义:[代码]其基本上是用汇编实现的,这里说说其大体的过程: 初始化的时候,给lock赋值为0x0100 0000,也就是允许的读者的最大个数.加读锁的时候,只要这个值减1后不为负,那么就能得到 该锁。而加写锁的时候,比较这个这个值是否等于0x0100 0000,如...
阅读全文
摘要:上一篇博客演示了一个最简单的进程的创建过程,这篇博客来演示一个最基础的线程的例子。corecible回复我上篇博文时说:“不过真正的项目开发中,开子进 程用的很少。大多都是线程。”其实也说得挺有道理的,因为像java这样的语言中,原生就支持线程,并提供了一套完整的通信的方案。在linux中,线程实际上就是一个轻量级的进程,因为他们都是通过调用do_fork()函数,传入不同...
阅读全文
摘要:这段时间打算把以前学的东西好好做个总结,免得总是学一样,忘一样。Linux下的C编程,就从利用fork开辟一个新的进程开始吧。 最开始接触fork的时候,觉得这个函数确实很有意思,一次调用,两次返回,看看下面这段程序:[代码]运行结果如下:This is parent process,My pid is 2945This is a child process,My pid is 2946 最初...
阅读全文