pthread 学习笔记 (3)

读者-写者问题

一个缓冲区,有些进程只读取里面的内容,另外有的进程会修改里面的内容。为了保持数据的一致性,如果没有进程修改内容时,任意个读进程可以同时访问缓冲区,但是同一时间只能有一个写进程可以访问缓冲区,其它写进程和读进程都不能对缓冲区进行操作。

读者-写者问题和生产者-消费者问题不同的是,后者的每个线程都要修改缓冲区的内容,所以不得不使用互斥锁来保证数据一致性,而前者有些线程是只读的,多个只读线程同时访问并不会出现数据不一致的情况,所以在实现上不必为每个线程都加一个互斥锁,而是让多个读线程可以同时访问,只有写进程的访问是互斥的。

使用互斥锁实现

下面是利用 pthread_mutex 系列函数的实现。

#include <stdio.h>
#include <pthread.h>

struct pool {
   int nr_reader;
   unsigned long long value;
   pthread_mutex_t may_write, rd_count_mutex;
};

static void* writer(void* arg)
{
   struct pool* p = arg;

   while (1) {
      pthread_mutex_lock(&p->may_write);
      ++p->value;
      printf("writer: 

阅读全文…

linux 内核编译脚本

上一次编译内核已经是三年前倒腾 LFS 的事了。这两天心血来潮编译了最新的内核,写个脚本备份一下。这个脚本在 debian 6.0 下成功编译 3.2.0-rc5 并配置好 grub,在别的系统上可能不好使,所以这里更多的是一个过程记录。注释掉的部分是 grub 相关的,因为经实验发现这个工作 update-grub 已经做了。

#!/bin/bash

function display_usage()
{
   echo "Usage: $0 [install src | uninstall version]" >&2
}

if [ $# -ne 2 ]; then
   display_usage
   exit 1
fi

if [ 

阅读全文…

debian 安装和配置 oracle 数据库

这里记录一下在 debian 6.0 上安装和配置 oracle 数据库 11gR2 的一些注意事项。

准备工作

先设置一下环境变量(加入 ~/.bashrc):

export ORACLE_BASE=<oracle base>
export ORACLE_HOME=<install home>
export ORACLE_SID=<orcl> # default is orcl
export PATH=$PATH:$ORACLE_HOME/bin

注意环境变量的目录末尾不能带有“/”,否则会有奇奇怪怪的问题。然后读入设置:

. ~/.bashrc

安装一些包:

aptitude install gawk libaio1 libaio-dev libstdc++5
ln -s /usr/bin/gawk /bin/awk
ln 

阅读全文…