c - Posix 线程 - 并行线程

标签 c pthreads posix

int total = 200; // total is a global variable

void process()
{
    int local;
    for( int i = 0 ; i< 100 ; i++ ) 
    {
         local = total;
         local--;
         total = local;
    }
}

如果两个线程并行调用process(),两个线程完成处理后total的最大值和最小值是多少?

我认为最小值将为 0,但我不确定。最大值?? 199?

最佳答案

在 C11 中,这被定义为“未定义的行为”,这意味着它对此不提供任何保证。

这或多或少也适用于 C99,尽管 C99 编写时并未考虑到并发性。每个线程都不知道另一个线程。

每个线程都会查看全局变量“total”100 次。

但是,每个线程都会获取自己的本地副本,递减该副本,然后将其写回到全局变量total。

但是,线程可能会获取全局变量“total”并保留临时副本,直到函数结束才将其写回。在这种情况下,下限可能是 100。

如果他们不保留本地副本,total 可能会下降不超过 1,因为它们都同步获取total,减少本地副本,然后写回。

如果没有某种方法来同步线程,以便一个线程“获取”总数,修改它,然后在另一个等待时“释放”它,则无法保证它会达到 0。

互斥体、信号量等是跨线程同步访问的方法。

伪代码:

process() {
  for (loop) {
    grab_mutex(total);  // Will wait till total is free
    total--;
    release_mutex(total);
  }
}

但是,下界肯定是0;减少的机会不超过 200 个。

关于c - Posix 线程 - 并行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407198/

相关文章:

c - 外部内部函数

c - Renesas 编译错误符号 _FunctionName 多重定义

c - threadpools - 老板/ worker 与同行(工作人员)模型

c - assert(0 == pthread_mutex_destroy(&lock)); 的含义是什么?

c - 有人记得 Visual C 版本 5 中 CL.EXE 的选项吗?

c - Eclipse C 编译不工作

c - 无限循环在 pthread 中终止

c - 命令行错误消息的 "POSIX-defined format"是什么?哪个标准?

python - 文件锁定似乎不起作用(flock/lockf)

c - 如何创建 POSIX 共享消息队列而不将其仅创建为 root 访问权限?