摘要:
在上篇博文《线程并发执行带来的问题》的评论中,有几个朋友(锦瑟无端五十弦、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,... 阅读全文
摘要:
进程和线程是我们平时接触的比较多的两个概念,特别是线程机制,很多语言原生就支持它。前段时间主要演示了下linux下进程和线程的创建,这篇文章对其创建的过程做一个简单的分析,错误之处,还请您斧正。 在linux下,线程其实就是一个轻量级的进程,所以其实现都是通过调用给do_fork函数传入不同的参数实现的。先来看下这几个函数:[代码][代码][代码] 上面的代码中,并没有看到fork()函数的实... 阅读全文
摘要:
这个程序是前段时间学习线程间同步的时候写的,利用读写锁来实现的(我感觉读写锁就是专门为这类问题而生的):[代码]看看读写锁的结构体定义:[代码]其基本上是用汇编实现的,这里说说其大体的过程: 初始化的时候,给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 最初... 阅读全文
摘要:
这个学期,开始接触linux内核,觉得其linux内核的实现机制确实挺有趣的,我个人比较喜欢模块这种设计方式,感觉其极大的扩展了内核,感觉就像是window程序中的动态链接库一样,只有当需要的时候,才会加载进来。 就和人与人之间第一次接触一样,和内核开始打交道,首先还是相互问好(当然,内核跟我们问好,就回馈在它能乖乖的听我的话,把信息正确地输出)。程序很简单,就是在进入内核的时候,打印一个Hel... 阅读全文
摘要:
linxu下阅读内核源代码,通常都使用vim + ctags 或者 lxr进行,我个人比较倾向于lxr,因为lxr提供了良好的界面,函数和定义都使用超链接标记出来,可以很方便的跟踪到函数内部去查看详细或者查看数据结构的定义等。网上有现成的网站提供了这样的服务,如果你只是偶尔看看内核源代码的话,其实直接登录某些提供这样服务的网站就差不多了,比如LXR,这个网站提供的体验相当不错,我以前就是经常在这个... 阅读全文
摘要:
接下来看看字体对话框的实现代码:效果如下: 最后来看个比较有意思的进度对话框:这些内建对话框,确实能节省我们不少时间。 阅读全文
摘要:
学习任何语言,基本上都是从向世界问好(Hello World)开始,这似乎已经成为了一种惯例,学习Qt也不例外。以前一直都不知道为什么要这样的约定俗成,后来看了别人的写的博客,才知道,原来这是一个新生命向世界发出的第一声问候,也体现了程序员对我们生活的这个世界的尊重。当然,可能说得有点太过于虚,不过还是蛮不错的一种解释。 阅读全文