Как исправить следующий поток, чтобы быть более правильным? Использование Pthread - PullRequest
1 голос
/ 24 июня 2019

Я изучаю использование 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 Ответ

1 голос
/ 24 июня 2019

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);
      }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...