摘要:信号量、互斥锁和条件变量之间的差异1、互斥锁必须总是由给它上锁的线程解锁,信号量的挂出(V操作)却不必由执行过它的等待(P操作)的同一线程执行。2、互斥锁要么被锁住,要么被解开。3、信号量有一个与之关联的状态(计数值),那么信号量的挂出操作总是被记住。然而当向一个条件变量发送信号时,如果没有线程等待该条件,那么信号将会丢失。Posix提供互斥锁和条件变量,同时又提供信号量的原因是:通常互斥锁和条件变量应用于线程间同步,信号量应用于进程间同步,但是他们也都可以应用于进程和线程同步。
阅读全文
摘要:线程间同步:生产者与消费者问题,分别为一个线程执行生产消费,信号量则在进程空间中共享。sem.c:#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>sem_t *put;sem_t *get;int nitems;int curr;void*producer(){ while(1){ sem_wait(put); if(curr > n
阅读全文
摘要:管道函数#inlcude <unistd.h>int pipe(int fd[2])上图来自unix网络编程卷二,描述了父子进程通过两个管道进行数据通信。一个简单父子进程通信的例程:pipe.h:#include <unistd.h>#include <stdlib.h>#include <stdio.h>void server(int rd,int wr){ char buff[100]; ssize_t n; if((n = read(rd,buff,100)) ==0){ printf("no chars\n"); re
阅读全文
摘要:互斥锁用于保护临界区,保证任何时刻只有一个线程或进程执行其中的代码,临界区是一次只能允许一个线程或进程使用的共享资源。生产者和消费者问题代码如下:View Code #include <stdlib.h>#include <stdio.h>#include <pthread.h>int nitems;pthread_mutex_t imux;int curp;void*producer(){ while(1){ pthread_mutex_lock(&imux); curp++; if(curp>nitems){ pthread_mutex_u
阅读全文
摘要:以下是K&R第二版中文版原话: malloc不是分配一个编译时已知的固定大小的数组,而是当需要时向操作系统申请空间。由于程序中的其他地方需要申请空间,并不一定通过调用malloc实现,因此由malloc管理的空间不一定是连续的。因此空闲的存储空间以空闲块列表的方式保存,每个块包含有一个长度、指向下一个的指针和自己的存储空间。这些块以地址的上升顺序排列在一起,最后一块(最高地址)指向第一块。 当有申请请求时,扫描空闲块列表以找到一个足够大的块,这个算法称为“最先匹配”;与之对应的算法是“最优匹配”它寻找满足条件且最小的块。如果这个块刚好与请求的大小相符合,将它从链表中移走并返回给用户。如
阅读全文
摘要:两个简单的消息队列发送和接受的例子:send.c:#include <stdlib.h>#include <stdio.h>#include <mqueue.h>#include <sys/stat.h>int main(){ mqd_t mqd; struct mq_attr attr; int flags; flags = O_RDWR | O_CREAT; mqd = mq_open("/temp.1234",flags,S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH,NULL); mq_getattr(
阅读全文
摘要:文件偏移量可以大于文件长度,在这种情况下,文件的下一次写将加长该文件并在文件中构成一个空洞,这是被允许的,并且文件中未被写的部分均读取为0。文件的空洞并不要求在磁盘上占用存储空间,具体的处理方式与文件系统有关。
阅读全文