• sem_post


    /* See sem_wait for an explanation of the algorithm.  */
    int
    __new_sem_post (sem_t *sem)
    {
      struct new_sem *isem = (struct new_sem *) sem;
      int private = isem->private;

    #if __HAVE_64B_ATOMICS
      /* Add a token to the semaphore.  We use release MO to make sure that a
         thread acquiring this token synchronizes with us and other threads that
         added tokens before (the release sequence includes atomic RMW operations
         by other threads).  */
      /* TODO Use atomic_fetch_add to make it scale better than a CAS loop?  */
      uint64_t d = atomic_load_relaxed (&isem->data);
      do
        {
          if ((d & SEM_VALUE_MASK) == SEM_VALUE_MAX)
        {
          __set_errno (EOVERFLOW);
          return -1;
        }
        }
      while (!atomic_compare_exchange_weak_release (&isem->data, &d, d + 1));

      /* If there is any potentially blocked waiter, wake one of them.  */
      if ((d >> SEM_NWAITERS_SHIFT) > 0)
        futex_wake (((unsigned int *) &isem->data) + SEM_VALUE_OFFSET, 1, private);
    #else
      /* Add a token to the semaphore.  Similar to 64b version.  */
      unsigned int v = atomic_load_relaxed (&isem->value);
      do
        {
          if ((v >> SEM_VALUE_SHIFT) == SEM_VALUE_MAX)
        {
          __set_errno (EOVERFLOW);
          return -1;
        }
        }
      while (!atomic_compare_exchange_weak_release
         (&isem->value, &v, v + (1 << SEM_VALUE_SHIFT)));

      /* If there is any potentially blocked waiter, wake one of them.  */
      if ((v & SEM_NWAITERS_MASK) != 0)
        futex_wake (&isem->value, 1, private);
    #endif

      return 0;
    }
    versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_34);

  • 相关阅读:
    1524. 和为奇数的子数组数目
    计算机网路复习01
    优维低代码:Transform 数据转换
    猜测了一个sora模型结构
    系统编程07-线程的互斥锁、读写锁、条件变量
    gtsummary绘制三线表/基线资料表/表格
    备战蓝桥杯Day27 - 省赛真题-2023
    C#重启 --- 语言基础2
    表达式语言的新趋势!了解SPEL如何改变开发方式
    MATLAB图像批处理之图格式批量转换
  • 原文地址:https://blog.csdn.net/wmzjzwlzs/article/details/128126770