当前位置: 技术问答>linux和unix
Unix进程互斥
来源: 互联网 发布时间:2016-03-06
本文导语: 多个进程会同时操作一张oracle表,CURSOR打开失败,所以想做一下进程之间的互斥, 执行表操作函数前lock一下,操作完后unlock,如果已经有lock则阻塞等待到解锁后执行表操作。 如何实现。谢谢。 | 进程...
多个进程会同时操作一张oracle表,CURSOR打开失败,所以想做一下进程之间的互斥,
执行表操作函数前lock一下,操作完后unlock,如果已经有lock则阻塞等待到解锁后执行表操作。
如何实现。谢谢。
执行表操作函数前lock一下,操作完后unlock,如果已经有lock则阻塞等待到解锁后执行表操作。
如何实现。谢谢。
|
进程间互斥一般都用信号量。下边是一段用信号量互斥下多进程使用共享内存的例子。楼主可以参考一下。
//client.c
#include
#include
#include
#define SEGSIZE 1024
#define READTIME 1
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
// 打印程序执行时间
void out_time(void)
{
static long start = 0;
time_t tm;
if (0 == start){
tm = time(NULL);
start = (long)tm;
printf(" now start ...n");
}
printf(" second: %ld n",(long)(time(NULL)) - start);
}
//创建信号量
int new_sem(key_t key)
{
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,0,0);
if (-1 == semid){
printf("create semaphore errorn");
exit(-1);
}
return semid;
}
//等待信号量变成0
void wait_p(int semid)
{
struct sembuf sops={0,-1,0};
semop(semid,&sops,1);
}
void wait_v(int semid)
{
struct sembuf sops={0,+1,0};
semop(semid,&sops,1);
}
int main(void)
{
key_t key;
int shmid,semid;
char *shm;
char msg[100];
int i;
key = ftok("/root/arm/test",0);
shmid = shmget(key,SEGSIZE,0);
if(-1 == shmid){
printf(" create shared memory errorn");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory errorn");
return -1;
}
semid = new_sem(key);
wait_p(semid);
for (i = 0;i f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
/* ... continue initialization ... */
}
return(fp);
}
void
foo_hold(struct foo *fp) /* add a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count++;
pthread_mutex_unlock(&fp->f_lock);
}
void
foo_rele(struct foo *fp) /* release a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
if (--fp->f_count == 0) { /* last reference */
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
} else {
pthread_mutex_unlock(&fp->f_lock);
}
}