0

我有一个全局变量flag、一个函数this()和一个函数that()。现在,main()this()所有人that()都有需要阅读和/或写作的场合flag。要正确使用互斥锁,我需要:

  1. 声明一个pthread_mutex_t并初始化它。
  2. this()为andthat()和它们创建线程,pthread_join()因为我想在退出之前main()等待this()that()完成。
  3. 代码中的任何位置,无论是main()this()还是that(),在哪里flag被读取或写入,调用pthread_mutex_lock()然后 [read/write]flag然后调用pthread_mutex_unlock()

那是对的吗?

我不打算这样做,但如果我想像这样检查flag无限循环main()

    while(flag != value)
        continue;

lock()您和互斥体以及其他线程会在哪里unlock()有机会访问flagmain()不断地在它上面?

4

1 回答 1

1

1 - 2 - 3 - 正确。

现在,如果你写那个循环,那么

  • 由于3,主线程将持有锁,而其他线程将无法获取锁,因此实际上,您创建了一个无限循环。
  • 如果您不锁定,则它可能无法正常工作,这取决于 CPU 架构(首先,flag需要可原子更新,并且其他内核需要看到这些更改。并非所有架构都保证这一点)。即使它有效,它仍然是一个繁忙的等待循环,不应该使用。

正如 Ben 在他的评论中指出的那样,您想使用条件变量来发出信号(注意:Pthread 和等待条件

你会在哪里锁定()和解锁()互斥锁

作为一个经验法则,为了尽量减少争用,保持锁尽可能短。这可以像 lock+read+unlock 一样简单,但是如果以下操作序列取决于标志不应更改的事实,则根据需要保持锁定。

于 2013-03-20T22:42:43.313 回答