• Linux内核同步/进程/线程同步


    内核同步:
    主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区保护。主要有一下几种方式:
    1. Mutex(互斥)
    头文件:
    #include <linux/mutex.h>
    初始化方法:
    DEFINE_MUTEX(name);或者
    void mutex_init(struct mutex *lock);
    使用方法:
    void mutex_lock (struct mutex *lock);
    Tries to lock the mutex, sleeps otherwise.
    Caution: can't be interrupted, resulting in processes you cannot kill!

    int mutex_lock_interruptible (struct mutex *lock);
    Same, but can be interrupted. If interrupted, returns a non zero value and doesn't hold the lock. Test the return value!!!

    int mutex_trylock (struct mutex *lock);
    Never waits. Returns a non zero value if the mutex is not available.int mutex_is_locked(struct mutex *lock);Just tells whether the mutex is locked or not.

    void mutex_unlock (struct mutex *lock);
    Releases the lock. Make sure you do it as quickly as possible!

    2. Reader/writer semphopres 读写信号量
    Allow shared access by unlimited readers, or by only 1 writer. Writers get priority.
    允许有限数量的读访问,但是只能有一个写访问。
    void init_rwsem (struct rw_semaphore *sem);
    void down_read (struct rw_semaphore *sem);
    int down_read_trylock (struct rw_semaphore *sem);
    int up_read (struct rw_semaphore *sem);
    void down_write (struct rw_semaphore *sem);
    int down_write_trylock (struct rw_semaphore *sem);
    int up_write (struct rw_semaphore *sem);
    Well suited for rare writes, holding the semaphore briefly. Otherwise, readers get starved, waiting too long for the semaphore to be released.

    线程同步

    1. semophore 信号量
    简单用法:
    #include <semaphore.h>
    sem_t bin_sem; 
    res = sem_init(&bin_sem, 0, 0);
    sem_wait(&bin_sem);
    sem_post(&bin_sem);
    sem_destroy(&bin_sem);

    2. Mutex 互斥
    头文件以及函数
    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
    int pthread_mutex_lock(pthread_mutex_t *mutex));
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    int pthread_mutex_destroy(pthread_mutex_t *mutex);

    3. Spinlocks 自旋锁
    初始化:
    Static
    spinlock_t my_lock = SPIN_LOCK_UNLOCKED;
    Dynamic
    void spin_lock_init (spinlock_t *lock);
    使用:
    void spin_[un]lock (spinlock_t *lock);
    Doesn't disable interrupts. Used for locking in process context (critical sections in which you do not want to sleep).
    void spin_lock_irqsave / spin_unlock_irqrestore (spinlock_t *lock, unsigned long flags);
    Disables / restores IRQs on the local CPU.
    Typically used when the lock can be accessed in both process and interrupt context, to prevent preemption by interrupts


    进程同步/通信

    1. Semaphore 信号量
    简单过程:
    semaphore sv = 1;
    loop forever {
    P(sv);
    critical code section;
    V(sv);
    noncritical code section;
    }
    头文件以及函数:
    #include <sys/sem.h>
    int semctl(int sem_id, int sem_num, int command, ...);
    int semget(key_t key, int num_sems, int sem_flags);
    int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);

    2.Share Memory 共享内存
    头文件以及函数
    #include <sys/shm.h>
    void *shmat(int shm_id, const void *shm_addr, int shmflg);
    int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
    int shmdt(const void *shm_addr);
    int shmget(key_t key, size_t size, int shmflg);

    3.Message Queues 消息队列
    头文件以及函数
    #include <sys/msg.h>
    int msgctl(int msqid, int cmd, struct msqid_ds *buf);
    int msgget(key_t key, int msgflg);
    int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
    int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

     

     原文地址 http://hi.baidu.com/%CD%F8%C2%E7%B0%D9%D1%A7%CC%C3/blog/item/f7df071a3af425eaae513341.html
  • 相关阅读:
    Windows桌面开发之窗口
    imes系统完善
    Dos.ORM简单说明
    C# 调用C++ dll的方法
    Windows10内置Linux子系统(WSL)Vmmem内存占用过大问题
    Docker 常用命令
    Typora 激活
    C# LINQ去重
    Windows10内置Linux子系统(WSL)映射本地盘符
    00-mORMot安装
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2026409.html
Copyright © 2020-2023  润新知