对于我必须上学的项目,有人要求我使用线程编写程序。我正在使用的图书馆是<thread.h>
。为了了解线程的工作原理,我尝试通过在空白文件中编写一些代码来查看线程的行为。实际上,我感谢另一个stackoverflow问题,即如何传递给pthread_create()
类函数,这确实有效,但是现在又有另一个问题,我在任何地方都找不到答案。该程序编译并打印与我在类中放入的整数不对应的随机整数。也许线程调用的方法无法访问类内部的数据?那是代码:
class myClass {
public:
myClass() {
for(int i = 0; i < 5; i++)
values[i] = i*3;
}
void myFunction() {
pthread_t processIDs[5];
int count[5];
for(int i = 0; i < 5; i++) {
count[i] = i;
pthread_create(&processIDs[i], NULL, &printIntegerHelper, &count[i]);
}
for(int i = 0; i < 5; i++) {
pthread_join(processIDs[i], NULL);
}
}
private:
void* printInteger(int index) {
printf("%d", values[index]);
}
static void* printIntegerHelper(void* arg) {
Sleep(20);
return ((myClass *) arg)->printInteger(*((int*)arg));
}
protected:
int values[5];
};
int main(void){
myClass myObject;
myObject.myFunction();
return 0;
}
这里的主要问题是您试图将单个指针转换arg
为指向不同无关事物的两个指针,然后取消对结果的引用。如果没有不确定的行为,您将无法做到。您只能将一个指针传递给pthread_create()
,并且如果您需要传递更多的指针(例如,指针+索引),则需要一个附加的间接方式:将您的信息包装到struct
(或std::pair
/ std::tuple
)中,然后将一个指针传递给它。这就是std::thread
内部的事情。
简单的例子:
using Data = std::pair<myClass*, int>;
void myFunction() {
// ...
Data data[5];
for (int i = 0; i < 5; ++i) {
data[i] = {this, i};
pthread_create(&processIDs[i], NULL, &printIntegerHelper, &data[i]);
}
// ... (all created threads are joined here, so
// accessing data inside a thread is safe)
}
static void* printIntegerHelper(void* arg) {
const auto data = *reinterpret_cast<Data*>(arg);
data.first->printInteger(data.second);
return nullptr;
}
还要注意,即使以后不使用该值,非void
函数也应该起作用return
。唯一的例外是int main(...)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句