瀏覽代碼

feat: add semaphore to shared memory camera

lujw2 3 月之前
父節點
當前提交
808570f6dc
共有 2 個文件被更改,包括 10 次插入0 次删除
  1. 6 0
      src/create.cpp
  2. 4 0
      src/read.cpp

+ 6 - 0
src/create.cpp

@@ -7,6 +7,7 @@
 #include <iostream>
 #include <sys/mman.h>
 #include <fcntl.h>
+#include <semaphore.h>
 
 struct shm_data {
     int width;
@@ -77,6 +78,7 @@ int main() {
         close(cam_fd);
         return 1;
     }
+    sem_t *sem = sem_open("/my_semaphore", O_CREAT, 0644, 1);
 
     // 计算共享内存大小(缓冲区长度+元数据)
     size_t shm_size = sizeof(shm_data) + buf.length; // 使用实际缓冲区长度
@@ -124,8 +126,10 @@ int main() {
         }
 
         // 复制数据到共享内存(带实际数据大小)
+        sem_wait(sem);
         memcpy(shared_data->data, cam_buffer, buf.bytesused);
         shared_data->size = buf.bytesused;  // 记录实际数据大小
+        sem_post(sem);
     }
 
     // 清理资源
@@ -134,6 +138,8 @@ int main() {
     munmap(shared_data, shm_size);
     close(cam_fd);
     close(shm_fd);
+    sem_close(sem);
+    sem_unlink("/my_semaphore");  // 系统范围内删除信号量
     shm_unlink("/camera_shm");
 
     return 0;

+ 4 - 0
src/read.cpp

@@ -6,6 +6,7 @@
 #include <iostream>
 #include <opencv2/opencv.hpp>
 #include <vector>
+#include <semaphore.h>
 
 struct shm_data {
     int width;
@@ -22,6 +23,7 @@ int main() {
         perror("shm_open failed");
         return 1;
     }
+    sem_t *sem = sem_open("/my_semaphore", O_CREAT, 0644, 1);
 
     // 获取共享内存大小
     struct stat sb;
@@ -54,10 +56,12 @@ int main() {
 
     while (true) {
         // 创建JPEG数据缓冲区
+        sem_wait(sem);
         std::vector<uchar> jpeg_data(
             shared_data->data,
             shared_data->data + shared_data->size
         );
+        sem_post(sem);
 
         // 解码JPEG数据
         cv::Mat frame = cv::imdecode(jpeg_data, cv::IMREAD_COLOR);