我正在研究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);
}
该代码可以很好地工作,并且不会失败,但是似乎并不专业。当您更新标志时,是否有机会检查标志中的内容并掉落?
答案 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);
}