【问题标题】:Updating semaphore from main thread C++从主线程 C++ 更新信号量
【发布时间】:2018-04-11 22:38:28
【问题描述】:

我正在玩信号量并让自己陷入这个问题。我想要做的是从主线程更新 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> 
.
.
.

【问题讨论】:

  • 为什么不使用 std::threadstd::mutex 而不是 pthreads 编写 portable C++ 代码?
  • 这是他们使用pthread 的遗留代码的一部分。所以,我必须遵守这个约束。

标签: c++ multithreading synchronization pthreads semaphore


【解决方案1】:

不要复制信号量,因为它们依赖于它们的地址(内存中的位置)。

将一个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); 
    }
}

【讨论】:

  • 复制信号量有什么不好的原因吗?还是动态创建信号量通常是一件坏事?
  • '复制信号量有什么不好的原因吗?' - 是的,它不起作用。 “动态创建信号量通常是一件坏事?”一点也不,很常见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2019-06-28
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多