在网上搜了很多的资料,对于进程间的同步却很少,我这里实现了简单的互斥
对于信号量的创建就不介绍了,可以google
int sem_lock(int key) /* 加锁 */
{
struct sembuf op;
op.sem_num = 0;
op.sem_flg = SEM_UNDO;
op.sem_op = -1; //increment if abs(sem_op) < sem_val
if (semop(key, &op, 1) == -1)
perror("semop");
}
int sem_unlock(int key) /* 解锁 */
{
struct sembuf op;
op.sem_num = 0;
op.sem_flg = SEM_UNDO;
op.sem_op = 1;
if (semop(key, &op, 1) == -1)
perror("semop");
}
但是这样对于初始化状态不好控制,必须用两个锁,所以我该用了这种加锁,初始化状态为1就可以了。
int sem_lock(int key)
{
struct sembuf op;
op.sem_num = 0;
op.sem_flg = 0;
op.sem_op = -1; //-1 if abs(sem_op) >= sem_val
if (semop(key, &op, 1) == -1)
perror("semop");
}
int sem_unlock(int key)
{
struct sembuf op;
op.sem_num = 0;
op.sem_flg = 0;
op.sem_op = 1;
if (semop(key, &op, 1) == -1)
perror("semop");
}
2020/2/14备注:
上面使用的是System V版本比较复杂,POSIX 版本比较简单sem_wait sem_post即可。具体差异可以参考
http://blog.sina.com.cn/s/blog_590be5290102w7cu.html