问题1、runner服务器无空间了,清理空间方法:

解决方法:docker container prune   删除停止的容器
                  docker volume prune   删除停止的磁盘

                  systemtcl restart docker   重启docker

问题2、当删除了磁盘volume,未删除container时,cicd构建报错

ERROR:Job failed (system failure) :Error response from daemon: get  37b70cxxxxxxxxxxxxxxxxxxxxxx: no such volume (executor_docker.go:932:0s)

解决方法:

1、按照问题的方法处理。

2、新建项目,复制原始项目的代码和上库记录。

3、修改runner 配置/etc/gitlab-runner/config.toml 中的对应runner的volume参数值,将 “cache”值删除。

#pragma once
#include <windows.h>
#include <string>
#include <vector>
#include <thread>
#include <atomic>
#include <functional>
#include <mutex>

class SerialPort {
public:
    SerialPort();
    ~SerialPort();

    bool open(const std::string& portName, unsigned long baudRate);
    void close();
    bool isOpen() const;
    std::string getLastError() const;

    // 发送数据(线程安全)
    bool write(const std::vector<unsigned char>& data);
    bool write(const std::string& s);

    // 设置接收回调
    void setReceiveCallback(std::function<void(const std::vector<unsigned char>&)> cb);

private:
    void receiveLoop();

    HANDLE m_handle;
    std::atomic<bool> m_running;
    std::thread m_thread;
    std::string m_lastError;
    std::function<void(const std::vector<unsigned char>&)> m_callback;
    std::mutex m_writeMutex;
};

设计要点
std::atomic<bool> m_running:跨线程共享的运行标志,比 volatile bool 更安全。
std::mutex m_writeMutex:写操作加锁,保证多线程并发调用 write() 时的线程安全。
std::function 回调:用户可通过 lambda、函数指针等灵活注册数据接收处理逻辑。
RAII 析构:close() 在析构函数中自动调用,确保资源释放。

————————————————

逻辑说明:

  1. 循环读取,直到 m_running 为 false 或发生错误。
  2. ReadFile 在超时设置下最多阻塞 50ms,之后返回,即使未读到任何数据。
  3. 读到数据后:优先调用用户回调;无回调时默认打印 HEX + 可打印字符。
  4. 回调异常捕获:防止用户回调中的崩溃影响串口接收线程。
  5. 每次循环 sleep_for(10ms) 降低 CPU 占用。

————————————————
版权声明:本文为CSDN博主「沈跃泉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45834799/article/details/160124226

  • std::lock_guard 保证多线程同时调用 write() 时不会产生竞态。
  • 两个重载:一个接受字节数组,一个接受字符串,使用更方便
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐