- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究 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/
这个问题已经有答案了: How to check whether a string contains a substring in JavaScript? (3 个回答) 已关闭 4 年前。 需要在运
我已经为系统调用 sys_uname 编写了内联汇编代码,但它似乎不正确。 #include #include #include #include #include struct utsna
我想知道是否有一种方法可以轻松安全地纠正 float 。 例如, 输入时:"32 + 32.1 "结果:“64.0999999999999” 我还必须提到,在使用科学记数法时,这种情况经常发生。“(2
我想知道如果我定义一个基本 Activity 对象并将我的所有 Activity 作为其子类会发生什么。然后我在基类中声明一个静态变量,所有的子类都使用相同的静态变量还是每个子类都有一个。 例如。我的
我想知道自定义整数类型(如 time_t、socklen_t 等)的正确 printf 格式说明符是什么。 例如, #include #include #include #include #i
我有 175 个 mp4 视频文件和扩展名为 .ass 的字幕文件。不幸的是,我的智能电视无法阅读这些字幕。我计划将字幕刻录(硬编码)到视频中。 我使用这个命令: ffmpeg -i orgvideo
我希望当我在分号后按 enter 键时,光标能够正确缩进。我如何在 VS Code 中实现这一点? 最佳答案 您可以关闭 wrappingIndent,或将其设置回默认的 same,然后确保 form
我的工作地点是研究购买第三方工具,用于使用地理编码的基于批处理的美国和加拿大地址更正。 您使用了什么产品? 您喜欢他们什么? 您不喜欢他们什么? 请注意,我们是C/C++ Unix商店。 最佳答案 我
StyleCop 规则 SA1642 坚持要求我的构造函数文档头必须以“初始化...的新实例”开头。 虽然我同意规则本身,但我就是无法让自己接受 StyleCop 强制执行我认为丑陋的拼写。它是用“s
我有一个包含观察结果和观察日期的数据框。日期是从 csv 文件读取的,但仅包括月份和日期。 R 假设它们都是 2016 年的。我知道日期是按从最近到最近的顺序排列的,那么我该如何添加正确的年份呢? 输
我有一个像这样的 Controller 操作: List abcd = new List() foreach (var i in images) { abcd.Add("{url:'"+Get
我正在使用以下 Nginx配置以防止在我使用 x-robots tag 时索引某些文件夹中的内容 location ~ .*/(?:archive|filter|topic)/.* { add
我需要在表格中更正时区不匹配问题。 unix 时间戳 1253568477 之前的所有日期和时间都需要在其值中加上 5 小时才能使它们等于 GMT。 我有以下列... date(数据类型date),关
我有以下内容: class Program { static void Main(string[] args) { Process pr; pr = new P
我是 xampp 的初学者。每次启动 XAMPP 控制面板时,我都会在日志框中看到错误列表。这是一个例子: 14:58:16 [main] Initializing Control Panel
我在 onTouchEvent(MotionEvent event) 中响应自定义 View 内的触摸事件。我遇到坐标不一致的问题:event.getRaw(Y) 返回触摸的 Y 坐标,包括状态栏,但
这是我在 UITableViewHeaderFooterView View 中设置内容的方法。 - (id)initWithFrame:(CGRect)frame { self = [super in
我有一个像这样的子查询 Select id, sum(select fran_payment.amount from fran_payment
我需要实现 ContraintValidatorFactory 接口(interface),它是 jsr303 的一部分 public interface ConstraintValidatorFac
我的脚本似乎无法正常工作,我想要得到的内容是不言自明的。我尝试了几种不同的方法来完成这项工作,四处搜索并尝试解决它。 我还尝试通过 console.log() 检查 chrome 日志,但它没有运
我是一名优秀的程序员,十分优秀!