函数可重入性及编写规范
2013-10-08 10:38
211 查看
一、可重入函数
1)什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
2)可重入函数:
不为连续的调用持有静态数据。
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
绝不调用任何不可重入函数。
3)不可重入函数:
函数中使用了静态变量,无论是全局静态变量还是局部静态变量。
阅读全文>>
分类:Linux C/C+| 阅读(60)| 评论(0)
2011-02-15 16:44
Implicitly sharing
COW is used. Shallow copy takes place when copy construct a new object. Deep copy when writing takes place.
Qpen.h
void QPen::setWidth(int width)
{
if (width < 0)
qWarning("QPen::setWidth: Setting a pen width with a negative value is not defined");
阅读全文>>
分类:Linux C/C+| 阅读(65)| 评论(0)
2011-01-25 14:48
Cited from http://blog.21ic.com/user1/2949/archives/2007/35599.html
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
阅读全文>>
分类:Linux C/C+| 阅读(148)| 评论(0)
2010-11-25 17:00
exception safe, type safe, thread safe,reentrant
Item1: Memory-contigious, node-based container
Item2: Encapsulation
Item3: An easy way to make copying efficient, correct, and immune to the slicing problem is to create containers of pointers instead of containers of objects.
Item4: Call empty whenever you need to know whether a container has zero elements.
阅读全文>>
分类:Linux C/C+| 阅读(73)| 评论(0)
2010-11-25 16:58
Factory
AbstractFactory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Proxy
TemplateMethod
ChainofResponsibility
Flyweight
Command
Observer
Strategy
State
Iterator
Memento
Vistor
In C++, the essential of design pattern is
阅读全文>>
分类:Linux C/C+| 阅读(50)| 评论(0)
2010-11-01 14:01
diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。
patch能将diff文件运用于 原来的两个集合之一,从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。
这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:
阅读全文>>
分类:Linux C/C+| 阅读(89)| 评论(0)
2010-10-27 15:43
pthread_create can not use class normal methods directly, but can use static methods. Here is a example:
//g++ -o test test.c -lpthread
#include <iostream>
#include <pthread.h>
using namespace std;
class Testing
{
private:
//cLog* m_Log;
pthread_t tid; // would one suffice?
阅读全文>>
分类:Linux C/C+| 阅读(160)| 评论(1)
2010-10-20 16:01
1. SELS 11.1
glibc-2.9-2.8.src.rpm
libsepol-devel-2.0.32-5.38.i586.rpm
libselinux-devel-2.0.71-3.38.i586.rpm
2.安装libsepol-devel,libselinux-devel 和glibc-2.9-2.8.src.rpm
3.rpmbuild -bb glibc.spec
4.编辑/usr/src/packages/BUILD/glibc-2.9中文件,tar xvf glibc-2.9-2008111711.tar.bz2,并cp 到SOURCE目录,修改spec文件重新编译
5.安装新版本glibc
rpm -ivh glibc-2.9-2.8.i586.rpm
阅读全文>>
分类:Linux C/C+| 阅读(338)| 评论(0)
2010-09-26 23:22
Linux下的多线程编程
本文出自:http://www.china-pub.com 作者: 姚继锋 (2001-08-11 09:05:00)
1 引言
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的 Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
使用多线程的理由之一是和进程
阅读全文>>
分类:Linux C/C+| 阅读(98)| 评论(0)
2010-09-15 13:12
strncpy
原型:extern char *strncpy(char *dest, char *src, int n);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
举例:
// strncpy.c
#include <syslib.h>
#include <string.h>
1)什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
2)可重入函数:
不为连续的调用持有静态数据。
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
绝不调用任何不可重入函数。
3)不可重入函数:
函数中使用了静态变量,无论是全局静态变量还是局部静态变量。
阅读全文>>
分类:Linux C/C+| 阅读(60)| 评论(0)
Implicitly sharing
V.S explicitly sharing
2011-02-15 16:44Implicitly sharing
COW is used. Shallow copy takes place when copy construct a new object. Deep copy when writing takes place.
Qpen.h
void QPen::setWidth(int width)
{
if (width < 0)
qWarning("QPen::setWidth: Setting a pen width with a negative value is not defined");
阅读全文>>
分类:Linux C/C+| 阅读(65)| 评论(0)
讲讲volatile的作用
2011-01-25 14:48Cited from http://blog.21ic.com/user1/2949/archives/2007/35599.html
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
阅读全文>>
分类:Linux C/C+| 阅读(148)| 评论(0)
C++ STL notes
2010-11-25 17:00exception safe, type safe, thread safe,reentrant
Item1: Memory-contigious, node-based container
Item2: Encapsulation
Item3: An easy way to make copying efficient, correct, and immune to the slicing problem is to create containers of pointers instead of containers of objects.
Item4: Call empty whenever you need to know whether a container has zero elements.
阅读全文>>
分类:Linux C/C+| 阅读(73)| 评论(0)
Design patterns in
C++
2010-11-25 16:58Factory
AbstractFactory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Proxy
TemplateMethod
ChainofResponsibility
Flyweight
Command
Observer
Strategy
State
Iterator
Memento
Vistor
In C++, the essential of design pattern is
阅读全文>>
分类:Linux C/C+| 阅读(50)| 评论(0)
diff和patch使用指南
2010-11-01 14:01diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。
patch能将diff文件运用于 原来的两个集合之一,从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。
这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:
阅读全文>>
分类:Linux C/C+| 阅读(89)| 评论(0)
pthread_create in
class method
2010-10-27 15:43pthread_create can not use class normal methods directly, but can use static methods. Here is a example:
//g++ -o test test.c -lpthread
#include <iostream>
#include <pthread.h>
using namespace std;
class Testing
{
private:
//cLog* m_Log;
pthread_t tid; // would one suffice?
阅读全文>>
分类:Linux C/C+| 阅读(160)| 评论(1)
glibc编译和调试
2010-10-20 16:011. SELS 11.1
glibc-2.9-2.8.src.rpm
libsepol-devel-2.0.32-5.38.i586.rpm
libselinux-devel-2.0.71-3.38.i586.rpm
2.安装libsepol-devel,libselinux-devel 和glibc-2.9-2.8.src.rpm
3.rpmbuild -bb glibc.spec
4.编辑/usr/src/packages/BUILD/glibc-2.9中文件,tar xvf glibc-2.9-2008111711.tar.bz2,并cp 到SOURCE目录,修改spec文件重新编译
5.安装新版本glibc
rpm -ivh glibc-2.9-2.8.i586.rpm
阅读全文>>
分类:Linux C/C+| 阅读(338)| 评论(0)
Linux下的多线程编程(pthread)
2010-09-26 23:22Linux下的多线程编程
本文出自:http://www.china-pub.com 作者: 姚继锋 (2001-08-11 09:05:00)
1 引言
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的 Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
使用多线程的理由之一是和进程
阅读全文>>
分类:Linux C/C+| 阅读(98)| 评论(0)
memcpy和strncpy两个函数用法
2010-09-15 13:12strncpy
原型:extern char *strncpy(char *dest, char *src, int n);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
举例:
// strncpy.c
#include <syslib.h>
#include <string.h>