gpt4 book ai didi

c++ - 在 C++ 中实现二进制信号量类

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:29 26 4
gpt4 key购买 nike

因此,我正在我的一门类(class)中研究调度程序。基本上,我们假装一次只能执行一个线程。我们应该使用一个信号量类来让这些线程阻塞自己来模拟等待 CPU 的线程。

问题是,线程似乎在错误的时间阻塞并在错误的时间执行。我想知道我是否缺少对信号量的一些概念性理解以及如何实现它。我想知道是否可以就我的实现获得一些反馈。讲师提供了这个头文件,我没有以任何方式修改:

class Semaphore {
private:
int value;
pthread_mutex_t m;
pthread_cond_t c;

public:

/* -- CONSTRUCTOR/DESTRUCTOR */

Semaphore(int _val);

//~Semaphore();

/* -- SEMAPHORE OPERATIONS */

int P();
int V();
};

这是我使用 posix 的实现:

Semaphore::Semaphore(int _val){
value = _val;
c = PTHREAD_COND_INITIALIZER;
m = PTHREAD_MUTEX_INITIALIZER;
}

int Semaphore::P(){
if(value <= 0){
pthread_cond_wait(&c, &m);
}
value--;
}

int Semaphore::V(){
value++;
if(value > 0){
pthread_cond_signal(&c);
}
}

最佳答案

您忽略了锁定互斥量。

其次,你这里有一个计数信号量,而不是二进制信号量。二进制信号量只有两种状态,因此 bool 变量是合适的:

class Semaphore {
private:
bool signaled; // <- changed
pthread_mutex_t m;
pthread_cond_t c;

void Lock() { pthread_mutex_lock(&m); } // <- helper inlines added
void Unlock() { pthread_mutex_unlock(&m); }
public:

/* -- CONSTRUCTOR/DESTRUCTOR */

Semaphore(bool);

//~Semaphore();

/* -- SEMAPHORE OPERATIONS */

void P(); // changed to void: you don't return anything
void V();
};

实现:

// consider using C++ constructor initializer syntax.

Semaphore::Semaphore(bool s){ // don't use leading underscores on identifiers
signaled = s;
c = PTHREAD_COND_INITIALIZER; // Not sure you can use the initializers this way!
m = PTHREAD_MUTEX_INITIALIZER; // they are for static objects.

// pthread_mutex_init(&m); // look, this is shorter!
}

void Semaphore::P(){
Lock(); // added
while (!signaled){ // this must be a loop, not if!
pthread_cond_wait(&c, &m);
}
signaled = false;
Unlock();
}

void Semaphore::V(){
bool previously_signaled;
Lock();
previusly_signaled = signaled;
signaled = true;
Unlock(); // always release the mutex before signaling
if (!previously_signaled)
pthread_cond_signal(&c); // this may be an expensive kernel op, so don't hold mutex
}

关于c++ - 在 C++ 中实现二进制信号量类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com