为啥我不能调用我的结构信号量方法?

Posted

技术标签:

【中文标题】为啥我不能调用我的结构信号量方法?【英文标题】:Why can't I call my struct Semaphore methods?为什么我不能调用我的结构信号量方法? 【发布时间】:2020-08-18 09:36:57 【问题描述】:

我正在尝试输入小写字符并将其添加到 in.buffer,另一个线程应从 in.buffer 读取并将其变为小写并发送到 out.buffer,最后一个应从 out.buffer 读取并打印出来。

我收到错误:数字常量信号量 m_free(10) 之前的预期标识符; 错误:成员函数‘Semaphore RingBuffer::m_free(int)’的使用无效

为什么会这样?

谢谢

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

struct Semaphore 

    Semaphore() = default;
    Semaphore(int x) : m_s(x) 
    
    void release() 
        std::unique_lock<std::mutex> lock(m_mut);
        m_s += 1;
        m_cv.notify_one();
    
    void acquire() 
        std::unique_lock<std::mutex> lock(m_mut);
        m_cv.wait(lock, [this]() return m_s != 0; );
        m_s -= 1;
    
    
    private:
    int m_s = 0;
    std::mutex m_mut;
    std::condition_variable m_cv;
;

struct RingBuffer 
    void write(char x);
    char read();
    
    private:
    std::array<char, 10> m_buff;
    int m_w = 0;
    int m_r = 0;
    Semaphore m_free(10);
    Semaphore m_taken(0);
    std::mutex m_mut;
;

void RingBuffer::write(char x) 
    m_free.acquire();
    
        std::lock_guard<std::mutex> l(m_mut);
        m_buff[m_w] = x;
        m_w = m_w % 10 == 0 ? 0 : m_w + 1;
    
    m_taken.release();

char RingBuffer::read() 
    int res=-1;
    m_taken.acquire();
    
        std::lock_guard<std::mutex> l(m_mut);
        res = m_buff[m_r];
        m_r = m_r % 10 == 0 ? 0 : m_r + 1;
    
    m_free.release();
    return res;


int main()

    //RING_SIZE;
    RingBuffer in,out;
    std::thread threadin([&in]()
        //while(true)
        char ch;
        std::cin>>ch;
        in.write(ch);
        
            
        //
    );
    std::thread threaddo([&in,&out]()
        char ch=in.read();
         ch=ch-32;
         out.write(ch);
        //
    );
    std::thread threadout([&out]()
        //while(true)
        char ch=out.read();
        std::cout<<ch<<std::endl;
        //
    );
    
    threadin.join();
    threaddo.join();
    threadout.join();
    return 0;

【问题讨论】:

Semaphore m_free(10) -> Semaphore m_free10 但是为什么会这样呢? 【参考方案1】:

您不能“调用”struct 中的任何内容。 struct 包含其成员的定义,而不是代码。

你可以在constructor中初始化一个成员:

struct RingBuffer 
    Semaphore m_free;
    RingBuffer() : m_free(10)  // constructor with a member-initializer-list
;

或使用default member initializer 内联:

struct RingBuffer 
    Semaphore m_free 10;
;

或者

struct RingBuffer 
    Semaphore m_free = 10;
;

但是没有使用()初始化成员的语法。

【讨论】:

以上是关于为啥我不能调用我的结构信号量方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 pyqt 信号错误会冻结 ui,直到调用另一个 python 函数

为啥我不能忽略 SIGSEGV 信号?

为啥不建议从 finally 子句中调用二进制信号量的 release() 方法?

为啥我的微信不能搜索公众号

为啥我的信号处理程序(引发异常)不会多次触发?

PHP exec():为啥我可以访问共享内存,但不能访问命名信号量? (错误号 = 13)