<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 5.8.?快速參考 本章已介紹了很多符號給并發的管理. 最重要的這些在此總結: ~~~ #include <asm/semaphore.h> ~~~ 定義旗標和其上操作的包含文件. ~~~ DECLARE_MUTEX(name); DECLARE_MUTEX_LOCKED(name); ~~~ 2 個宏定義, 用來聲明和初始化一個在互斥模式下使用的旗標. ~~~ void init_MUTEX(struct semaphore *sem); void init_MUTEX_LOCKED(struct semaphore *sem); ~~~ 這 2 函數用來在運行時初始化一個旗標. ~~~ void down(struct semaphore *sem); int down_interruptible(struct semaphore *sem); int down_trylock(struct semaphore *sem); void up(struct semaphore *sem); ~~~ 加鎖和解鎖旗標. down 使調用進程進入不可打斷睡眠, 如果需要; down_interruptible, 相反, 可以被信號打斷. down_trylock 不睡眠; 相反, 它立刻返回如果旗標不可用. 加鎖旗標的代碼必須最終使用 up 解鎖它. ~~~ struct rw_semaphore; init_rwsem(struct rw_semaphore *sem); ~~~ 旗標的讀者/寫者版本和初始化它的函數. ~~~ void down_read(struct rw_semaphore *sem); int down_read_trylock(struct rw_semaphore *sem); void up_read(struct rw_semaphore *sem); ~~~ 獲得和釋放對讀者/寫者旗標的讀存取的函數. ~~~ void down_write(struct rw_semaphore *sem); int down_write_trylock(struct rw_semaphore *sem); void up_write(struct rw_semaphore *sem); void downgrade_write(struct rw_semaphore *sem); ~~~ 管理對讀者/寫者旗標寫存取的函數. ~~~ #include <linux/completion.h> DECLARE_COMPLETION(name); init_completion(struct completion *c); INIT_COMPLETION(struct completion c); ~~~ 描述 Linux completion 機制的包含文件, 已經初始化 completion 的正常方法. INIT_COMPLETION 應當只用來重新初始化一個之前已經使用過的 completion. ~~~ void wait_for_completion(struct completion *c); ~~~ 等待一個 completion 事件發出. ~~~ void complete(struct completion *c); void complete_all(struct completion *c); ~~~ 發出一個 completion 事件. completion 喚醒, 最多, 一個等待著的線程, 而 complete_all 喚醒全部等待者. ~~~ void complete_and_exit(struct completion *c, long retval); ~~~ 通過調用 complete 來發出一個 completion 事件, 并且為當前線程調用 exit. ~~~ #include <linux/spinlock.h> spinlock_t lock = SPIN_LOCK_UNLOCKED; spin_lock_init(spinlock_t *lock); ~~~ 定義自旋鎖接口的包含文件, 以及初始化鎖的 2 個方法. ~~~ void spin_lock(spinlock_t *lock); void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); void spin_lock_irq(spinlock_t *lock); void spin_lock_bh(spinlock_t *lock); ~~~ 加鎖一個自旋鎖的各種方法, 并且, 可能地, 禁止中斷. ~~~ int spin_trylock(spinlock_t *lock); int spin_trylock_bh(spinlock_t *lock); ~~~ 上面函數的非自旋版本; 在獲取鎖失敗時返回 0, 否則非零. ~~~ void spin_unlock(spinlock_t *lock); void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags); void spin_unlock_irq(spinlock_t *lock); void spin_unlock_bh(spinlock_t *lock); ~~~ 釋放一個自旋鎖的相應方法. ~~~ rwlock_t lock = RW_LOCK_UNLOCKEDrwlock_init(rwlock_t *lock); ~~~ 初始化讀者/寫者鎖的 2 個方法. ~~~ void read_lock(rwlock_t *lock); void read_lock_irqsave(rwlock_t *lock, unsigned long flags); void read_lock_irq(rwlock_t *lock); void read_lock_bh(rwlock_t *lock); ~~~ 獲得一個讀者/寫者鎖的讀存取的函數. ~~~ void read_unlock(rwlock_t *lock); void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags); void read_unlock_irq(rwlock_t *lock); void read_unlock_bh(rwlock_t *lock); ~~~ 釋放一個讀者/寫者自旋鎖的讀存取. ~~~ void write_lock(rwlock_t *lock); void write_lock_irqsave(rwlock_t *lock, unsigned long flags); void write_lock_irq(rwlock_t *lock); void write_lock_bh(rwlock_t *lock); ~~~ 獲得一個讀者/寫者鎖的寫存取的函數. ~~~ void write_unlock(rwlock_t *lock); void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags); void write_unlock_irq(rwlock_t *lock); void write_unlock_bh(rwlock_t *lock); ~~~ 釋放一個讀者/寫者自旋鎖的寫存取的函數. ~~~ #include <asm/atomic.h> atomic_t v = ATOMIC_INIT(value); void atomic_set(atomic_t *v, int i); int atomic_read(atomic_t *v); void atomic_add(int i, atomic_t *v); void atomic_sub(int i, atomic_t *v); void atomic_inc(atomic_t *v); void atomic_dec(atomic_t *v); int atomic_inc_and_test(atomic_t *v); int atomic_dec_and_test(atomic_t *v); int atomic_sub_and_test(int i, atomic_t *v); int atomic_add_negative(int i, atomic_t *v); int atomic_add_return(int i, atomic_t *v); int atomic_sub_return(int i, atomic_t *v); int atomic_inc_return(atomic_t *v); int atomic_dec_return(atomic_t *v); ~~~ 原子地存取整數變量. atomic_t 變量必須只通過這些函數存取. ~~~ #include <asm/bitops.h> void set_bit(nr, void *addr); void clear_bit(nr, void *addr); void change_bit(nr, void *addr); test_bit(nr, void *addr); int test_and_set_bit(nr, void *addr); int test_and_clear_bit(nr, void *addr); int test_and_change_bit(nr, void *addr); ~~~ 原子地存取位值; 它們可用做標志或者鎖變量. 使用這些函數阻止任何與并發存取這個位相關的競爭情況. ~~~ #include <linux/seqlock.h> seqlock_t lock = SEQLOCK_UNLOCKED; seqlock_init(seqlock_t *lock); ~~~ 定義 seqlock 的包含文件, 已經初始化它們的 2 個方法. ~~~ unsigned int read_seqbegin(seqlock_t *lock); unsigned int read_seqbegin_irqsave(seqlock_t *lock, unsigned long flags); int read_seqretry(seqlock_t *lock, unsigned int seq); int read_seqretry_irqrestore(seqlock_t *lock, unsigned int seq, unsigned long flags); ~~~ 獲得一個 seqlock-保護 的資源的讀權限的函數. ~~~ void write_seqlock(seqlock_t *lock); void write_seqlock_irqsave(seqlock_t *lock, unsigned long flags); void write_seqlock_irq(seqlock_t *lock); void write_seqlock_bh(seqlock_t *lock); ~~~ 獲取一個 seqlock-保護的資源的寫權限的函數. ~~~ void write_sequnlock(seqlock_t *lock); void write_sequnlock_irqrestore(seqlock_t *lock, unsigned long flags); void write_sequnlock_irq(seqlock_t *lock); void write_sequnlock_bh(seqlock_t *lock); ~~~ 釋放一個 seqlock-保護的資源的寫權限的函數. ~~~ #include <linux/rcupdate.h> ~~~ 需要使用讀取-拷貝-更新(RCU)機制的包含文件. ~~~ void rcu_read_lock;void rcu_read_unlock; ~~~ 獲取對由 RCU 保護的資源的原子讀權限的宏定義. ~~~ void call_rcu(struct rcu_head *head, void (*func)(void *arg), void *arg); ~~~ 安排一個回調在所有處理器已經被調度以及一個 RCU-保護的資源可用被安全的釋放之后運行.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看