为啥我不能调用我的结构信号量方法?
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 函数