[英]Updating semaphore from main thread C++
我正在玩信号灯,并使自己陷入这个问题。 我想做的是从主线程更新pthread内部的信号量。 我创建了该struct
,并将带有该结构的semaphore
传递到pthread中,并在另一个函数中使用该结构执行sem_post
。 但是以下代码不起作用。 看来我传递给pthread的信号量与我在start
函数中使用的信号量不同。 有很多示例可以全局创建信号量并在线程中使用。 但是我想在本地创建信号灯,以便在需要时可以创建多个信号灯和多个线程进行同步。 我应该如何解决这个问题?
#include <iostream>
#include <semaphore.h>
#include <pthread.h>
#include <signal.h>
#include "unistd.h"
using namespace std;
class m {
public:
struct my_sem {
sem_t sem_lock;
};
m();
~m();
void create_threads();
void start(my_sem*);
static void *hello(void *);
};
m::m() {
create_threads();
}
m::~m() {}
void m::create_threads() {
pthread_t t1, t2;
sem_t s;
sem_init(&s, 0, 0);
my_sem *sem1 = new my_sem;
sem1->sem_lock = s;
pthread_create(&t1, null, hello, sem1);
start(sem1);
}
void *m::hello(void *arg) {
my_sem* a = (my_sem*)arg;
sem_t t = a->sem_lock;
while(1) {
sem_wait(&t);
cout << "hello" << endl;
}
}
void m::start(my_sem* s) {
sem_t h = s->sem_lock;
while(1) {
sleep(10);
sem_post(&h);
}
}
int main() {
m m;
return 0;
}
我在这里期望的输出是:
HELLO
<wait 10 seconds>
HELLO
<wait 10 seconds>
.
.
.
您不必复制信号量,因为它们依赖于它们的地址(在内存中的位置)。
将一个sem_t
分配给另一个,不会在它们之间共享状态。 该分配将复制一些值,但是您将有两个不同的信号量对象。
相反,您可以创建一个信号量作为某些类的成员,然后将其传递给指针,如下所示:
void m::create_threads() {
pthread_t t1, t2;
sem_init(&this->sem.sem_lock, 0, 0);
pthread_create(&t1, nullptr, hello, &this->sem);
start(&this->sem);
}
void *m::hello(void *arg) {
my_sem* a = (my_sem*)arg;
while(1) {
sem_wait(&a->sem_lock);
cout << "hello" << endl;
}
}
void m::start(my_sem* s) {
while(1) {
sleep(1);
sem_post(&s->sem_lock);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.