从主线程C++更新信号量
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);
}
}
相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?
- 从主线程C++更新信号量
- 生产者 - 消费者生产商创建2个元素POSIX信号量