c++ - C++ pthread - 如何从线程函数返回一个值而不等待完成?
问题描述
我遵循基本的 c++ 教程来制作多个线程。我有绘制循环,在框架中我启动了几个线程。我不等待 pthread_join 的线程结果,而是继续绘制其他对象。如果适当对象的并条机检测到所有线程都已完成,则我启动“threadsFinished”函数。在我写的时候,我不使用 pthread_join,相反,我喜欢将结果写入启动这些线程的对象,在我的例子中,它是类 Program。我通过线程函数中的指针访问“程序”对象,我可以在这里将结果写入该对象,但它是线程安全的吗?或者我应该将互斥锁与 Program 对象一起使用?
这是我的代码:
void Program::onDraw(Matrix *matrix) {
fireThreads();
....
if (threadsStarted && threadsFinishedCount == NUM_THREADS) {
threadsFinished();
}
...draw other stuff, progress bar etc...
}
void *Program::threadFunction(void *threadData) {
thread_data *data = static_cast<thread_data*>(threadData);
Program *program = static_cast<Program*>(data->owner);
program->threadsFinishedCount++;
pthread_exit(NULL);
}
void Program::fireThreads() {
if (threads == NULL) {
threads = new pthread_t[NUM_THREADS];
threadData = new thread_data[NUM_THREADS];
}
int rc;
int i;
threadsFinishedCount = 0;
threadsStarted = true;
for( i = 0; i < NUM_THREADS; i++ ) {
threadData[i].threadId = i;
threadData[i].owner = this;
rc = pthread_create(&threads[i], NULL, updateDB, (void *)&threadData[i]);
if (rc) {
...
}
}
}
使用的变量是这样定义的:
class Program {
...
static void *threadFunction(void *threadId);
bool threadsStarted;
volatile int threadsFinishedCount;
...
}
解决方案
推荐阅读
- python - 如何在 python 中的 SRT 文件中操作强?
- r - 如何将 id 列添加到 data.frames 列表中
- python - Django 转储数据不适用于 CharField 或 TextField 中的表情符号
- python-3.x - 尝试使用python通过字典的返回列表进行映射
- reactjs - React/Redux 购物车未更新
- tensorflow - NotImplementedError:无法转换符号张量 (cond_2/strided_slice:0)
- arrays - 循环 json 数据并将数据添加到 textLabel
- node.js - 在 generateEmailVerificationLink() FirebaseAdmin SDK 上更改 URL 的语言
- java - getLayoutPosition() 和 getAdapterPosition() 有什么区别?
- java - 当我运行 Jar 文件时,我不断收到 NoClassDefFoundError