如何修复下一个更正确的线程?使用Pthread

时间:2019-06-24 05:39:30

标签: c++ c multithreading pthreads

我正在研究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);
}

该代码可以很好地工作,并且不会失败,但是似乎并不专业。当您更新标志时,是否有机会检查标志中的内容并掉落?

1 个答案:

答案 0 :(得分:1)

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);
      }