gpt4 book ai didi

c++ - 如何修复下一个线程更正确?使用线程

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:39 25 4
gpt4 key购买 nike

我正在研究 PThread 的使用。

主进程打开相机,得到一个矩阵。然后调用在机器人中运行作业的线程,我希望它是并行的。基本上它可以运行。但仍然感觉不专业——因为 bool

在下面的代码中,这是一个示例(使用 fprintf)。

我很想知道如何在不损害并行性的情况下修复它。

在接下来的代码中,我不会显示对机器人的调用或摄像头打开。

感觉需要互斥体。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <opencv2/opencv.hpp>

#include <unistd.h> /// for sleep



bool inThread = false;
void *print_message_function( void *ptr );

int main()
{
char mkey = 0;
pthread_t thread1;
char *message1 = "Thread 1";
int iret1;
cv::Mat bgr_image = imread("image.bmp",cv::IMREAD_COLOR);
while(mkey!=27){
if(!inThread){
inThread = true;
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
}
printf("In Main");
imshow("mat", bgr_image);
mkey = cv:: waitKey(5);
}
return 0;
}

void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
sleep(2);
inThread = false;
pthread_exit(NULL);
}

代码做的很好,不掉,但是看起来不专业。有没有可能当你更新标志时,它会检查标志中的内容并掉落?

最佳答案

inThread 是并发读/写的,所以它的访问应该受到保护。

例如,使用互斥锁可以像下面这样完成。

  • 定义一个全局互斥锁并初始化它:

    pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
  • 包含 errno 以便能够为 pthread_*() 调用进行方便的错误检查/记录:

    #include <errno.h>
  • 改变这个

      if(!inThread){
    inThread = true;
    iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
    }

    成为

      errno = pthread_mutex_lock(&m);
    if (errno) {
    perror("pthread_mutex_lock() failed");
    exit(EXIT_FAILURE);
    }

    if (!inThread) {
    inThread = true;

    errno = pthread_mutex_unlock(&m);
    if (errno) {
    perror("pthread_mutex_unlock() failed");
    exit(EXIT_FAILURE);
    }

    ...
    }
    else {
    errno = pthread_mutex_unlock(&m);
    if (errno) {
    perror("pthread_mutex_unlock() failed");
    exit(EXIT_FAILURE);
    }
    }
  • 并改变这个

      inThread = false;

    成为

      errno = pthread_mutex_lock(&m);
    if (errno) {
    perror("pthread_mutex_lock() failed");
    exit(EXIT_FAILURE);
    }

    inThread = false;

    errno = pthread_mutex_unlock(&m);
    if (errno) {
    perror("pthread_mutex_unlock() failed");
    exit(EXIT_FAILURE);
    }

关于c++ - 如何修复下一个线程更正确?使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56730402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com