相关疑难解决方法(0)

C++ 0x没有信号量?如何同步线程?

是不是C++ 0x没有信号量?Stack Overflow上已经有一些关于信号量使用的问题.我一直使用它们(posix信号量)让线程等待另一个线程中的某个事件:

void thread0(...)
{
  doSomething0();

  event1.wait();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.post();

  ...
}
Run Code Online (Sandbox Code Playgroud)

如果我用互斥量做到这一点:

void thread0(...)
{
  doSomething0();

  event1.lock(); event1.unlock();

  ...
}

void thread1(...)
{
  event1.lock();

  doSomethingth1();

  event1.unlock();

  ...
}
Run Code Online (Sandbox Code Playgroud)

问题:它很难看并且不能保证thread1首先锁定互斥锁(假设同一个线程应该锁定和解锁互斥锁,你也无法在thread0和thread1启动之前锁定event1).

因此,由于boost也没有信号量,实现上述目标的最简单方法是什么?

c++ multithreading synchronization boost-thread c++11

124
推荐指数
7
解决办法
8万
查看次数

这种信号量的实现如何工作?

圣诞快乐!

我正在读"信号量小书".书中有一个C语言的实现,我并不完全理解.请参阅下面的代码.有这个唤醒变量.作者解释说:

唤醒计算未决信号的数量; 也就是说,已被唤醒但尚未恢复执行的线程数.唤醒的原因是为了确保我们的信号量具有第4.3节中描述的属性3

属性3:如果在线程执行信号时有线程在等待信号量,则必须唤醒其中一个等待线程.

好的,我想我理解了这个属性的含义.其中一个等待线程应该获取互斥锁而不是另一个(例如信令线程).如果我错了,请纠正我.我不明白的是这个机制如何保证这个属性.我说这家酒店不保证.非等待进程仍有可能获得互斥锁.我错过了什么?

typedef struct {
  int value, wakeups;
  Mutex *mutex;
  Cond *cond;
} Semaphore;

// SEMAPHORE

Semaphore *make_semaphore (int value)
{
  Semaphore *semaphore = check_malloc (sizeof(Semaphore));
  semaphore->value = value;
  semaphore->wakeups = 0;
  semaphore->mutex = make_mutex ();
  semaphore->cond = make_cond ();
  return semaphore;
}

void sem_wait (Semaphore *semaphore)
{
  mutex_lock (semaphore->mutex);
  semaphore->value--;

  if (semaphore->value < 0) {
    do {
      cond_wait (semaphore->cond, semaphore->mutex);
    } while (semaphore->wakeups < 1);
    semaphore->wakeups--;
  }
  mutex_unlock (semaphore->mutex);
} …
Run Code Online (Sandbox Code Playgroud)

c multithreading mutex semaphore conditional-statements

3
推荐指数
1
解决办法
8877
查看次数