织梦CMS - 轻松建站从此开始!

罗索

Unix/Linux下C/C++开发技术概览2

罗索客 发布于 2007-05-17 10:00 点击:次 
1.3 图形用户界面 Windows 和Unix 图形模型差异极大,这点是Unix和Windows程序开发最大的差别。UNIX 使用X Window 系统GUI,而Windows 使用GDI。虽然在概念上类似,但是X API 和GDI API 之间没有简单的对应。在Windows下面可以通过MFC等类库很方便的开发出图形用户界面
TAG:

1.3 图形用户界面

Windows 和Unix 图形模型差异极大,这点是Unix和Windows程序开发最大的差别。UNIX 使用X Window 系统GUI,而Windows 使用GDI。虽然在概念上类似,但是X API 和GDI API 之间没有简单的对应。在Windows下面可以通过MFC等类库很方便的开发出图形用户界面的程序,而Unix下相对来说就麻烦了些,缺少哪种所见即所得的好的开发工具。Unix下的GUI程序开发,是一个比较复杂的过程,这里就不在详细介绍。如果要进行Unix下面GUI程序的开发的话,可以单独去查找相关的文档。

1.4 并发处理

并发处理包括多进程和多线程的概念,Windows和Unix的并发处理差别也比较大,但是基本上都能找到一组对应的函数来实现类似的功能。

在Windows下,创建进程和线程可以通过调用Windows的API来完成,或者通过调用MFC提供的并发处理类库来实现。在Unix下面创建进程通常使用fork函数,这跟Windows下面的多进程概念有所不同,相当于在当前位置给当前进程创建一个副本;而Windows下的创建进程大都是创建一个新的进程。Unix下的多线程操作,通过一组线程函数来完成,通常我们使用POSIX 的PTHREAD线程库来创建线程,但是在不同的Unix分支系统中,都包含又自己的本地线程库。如在Solaris下面的本地线程库,是一组以thr_开头的函数,而POSIX的线程函数一般都已pthread_开头。虽然有两种不同的线程库空我们选择,但在某一个特定的系统下,他们的实现实质都是一样的,而且基本上都能够找到对应的函数。为了程序的可移植性,建议采用POSIX的线程库。这是大多数Unix系统都支持的线程库,但是不同系统下实现的功能可能有所差别,可能只是实现了这个函数库的一个子集。

在有些Unix系统下,没有实现线程库,如SCO Unix,系统只提供多进程的开发方式。但是,如果为了实现程序代码的统一性,我们可以采用第三方提供的线程库。这里有一个叫FSU-threads的线程库供我们选择。这个线程库中实现了POSIX中定义的线程函数,而且是开源的,可以支持SunOS 4.1.x, Solaris 2.x, SCO UNIX, FreeBSD, Linux等系统。除此之外,还有ZThreads线程库等。

在Windows的线程库中,实现了互斥(Mutex)、事件(Event)、信号量(Semaphore)等同步对象,用于实现线程之间的同步。在Unix下面,线程同步主要使用互斥(mutex)和条件变量(cond),其中条件变量可以实现事件和信号量的功能。另外, POSIX还定义了一套信号量函数,跟线程函数不同,是一组以sem_开头的函数(POSIX 1003.1b semaphores)。但是这套函数就不想POSIX线程函数支持的那么广泛了,比如在AIX上就不支持POSIX的信号量函数,不过AIX系统下有另一组函数来实现信号量的功能(SystemV semaphores)。在很多Unix系统中,同时支持POSIX的信号量和SystemV的信号量,在Solaris下面还有一套自己的本地函数来实现信号量。下面分别列出Unix系统中的用于并发处理的主要的函数。

进程

fork 创建进程

POSIX线程库
pthread_create 创建一个信的线程
pthread_attr_init 初始化一个线程属性对象
pthread_attr_destroy 释放一个线程属性对象
pthread_exit 终止执行调用的线程
pthread_join 把当前调用线程挂起,直到目标线程结束
pthread_setschedparam 设置线程的调度策略和优先级
pthread_getschedparam 获得线程的调度策略和优先级
pthread_sigmask 改变/检查调用线程的信号掩码
pthread_kill 发送信号到另一个线程
pthread_self 返回当前线程的ID
pthead_mutex_init 初始化一个互斥量
pthread_mutexattr_init 初始化互斥量的属性对象
pthread_mutex_lock 给一个互斥量加锁,如果互斥量已经被别的线程锁定,调用线程挂起,直到别的线程释放
pthread_mutex_unlock 释放互斥量(解锁)
ptherad_mutex_destroy 销毁一个互斥量
pthread_cond_init 初始化一个条件变量
pthread_condattr_init 初始化一个条件变量的属性对象
pthread_cond_wait 阻塞在一个条件变量上
pthread_cond_signal 解除下一个线程在条件变量的阻塞
pthread_cond_boradcast 解除所有线程在这个条件变量上的阻塞
pthread_cond_destroy 销毁一个条件变量
pthread_cancel 请求结束一个线程

Solaris本地线程库

thr_create 创建一个新线程
thr_exit 终止调用线程
thr_join 把当前调用线程挂起,直到目标线程结束
thr_yield 用当前线程创建出另一个线程
thr_suspend 挂起一个指定的线程
thr_continue 恢复一个被挂起的线程
thr_setprio 修改线程的优先级
thr_getprio 获得线程的优先级
thr_sigsetmask 改变/检查调用线程的信号掩码
thr_kill 发送信号到另一个线程
thr_self 返回当前线程的ID
thr_main 标记为主线程
thr_mutex_init 初始化一个互斥量
thr_mutex_lock 给一个互斥量加锁,如果互斥量已经被别的线程锁定,调用线程挂起,直到别的线程释放
thr_mutex_unlock 释放互斥量(解锁)
thr_mutex_destroy 销毁一个条互斥量
thr_cond_init 初始化一个条件变量
thr_cond_wait 阻塞在一个条件变量上
thr_cond_signal 解除下一个线程在条件变量的阻塞
thr_cond_boradcast 解除所有线程在这个条件变量上的阻塞
thr_cond_destroy 销毁任何状态的条件变量
rwlock_init 初始化一个读写锁
rw_rdlock 获得一个读写锁的读锁定
rw_wrlock 获得一个读写锁的写锁定
rw_unlock 解锁一个读写锁

POSIX信号量

sem_init 初始化一个信号量
sem_destroy 销毁一个信号量
sem_wait 等待获得一个信号量,获得后信号量的值减1,如果当前信号量值位0,当前线程阻塞,支持有别的线程释放信号量
sem_trywait 尝试获得一个信号量,获得后信号量的值减1,如果当前信号量值位0,返回失败
sem_post 释放一个信号量
sem_getvalue 获得指定信号量的值

System V信号量

semctl 对信号量进行一系列的控制
semget 创建一个信号量,成功时返回信号的ID
semop 对信号进行操作

Solaris的本地信号量,更接近于操作系统中我们学到的PV操作的信号灯

sema_init 初始化一个信号灯(信号量)
sema_destroy 销毁一个信号灯
sema_p 执行信号灯的P操作
sema_p_sig 跟sema_p类似,当阻塞再这个函数的时候,如果线程收到一个信号,函数退出
sema_tryp 尝试执行信号灯的P操作
sema_v 执行信号灯的V操作

为了方便使用,我在开发的过程中已经把上面常用的函数都封装成了类,兼容Windows和各种常见的Unix系统,而且网上还有很多这方面的代码资源可用。如果感兴趣的话可以向我索要。

1.5 网络通信
Socket(中文译名:套接字)最初在Unix上出现,并很快成为Unix上最流行的网络编程接口之一。后来,微软将它引入到Windows中并得到实现,于是从Windows 95、WinNT4开始,系统就内置了Winsock1.1,后来到了Windows98、Windows2000,它内置的Winsock DLL更新为Winsock2.2。

Windows下的Socket函数大体上和Unix下的Socket函数差不多,函数名称很参数用法都类似,只有一些细微的差别,某些参数的意义不同,而且对于Socket的属性控制也不太一样。Windows下面还对Socket函数进行了封装,有一系列相关类可用使用,简化网络编程的复杂性。Unix本身没有这些类库,但是我们也已经积累了很多这方面的经验和资源。我们有一组现成的类对Windows和Unix下的Socket函数进行了封装,上层只需要简单的调用即可,不用关心底层的差别。而且,这套类库也可以同时支持多种平台,可移植性非常好。

(iwgh)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200705/6674.html]
本文出处: 作者:iwgh
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容