【问题标题】:C++ thread error: no type named ‘type’ MINGWC++ 线程错误:没有名为“类型”MINGW 的类型
【发布时间】:2018-12-09 14:03:13
【问题描述】:

我目前正在为我的操作系统课程做一个项目,我必须编写一个程序来查找要在线程中运行的素数。

所以我这样做了:

#include <iostream>
#include <cmath>
#include <thread>
#define THREADNUMBER 100
using namespace std;


int CONTADOR = 0;
int CONTADORTHREADEXECUTADA = 0;
int primeRange(int v1, int v2) {
int a, limit;                        
bool isprime;

for (int i = v1; i <= v2; i++) {
    if (i % 2 != 0 && i % 3 != 0) {
        isprime = true;
        limit = i / 2;
        if(i == 1) isprime =false;


        limit = (int)sqrt(i); //General case

        for(a=2; a <= limit; a++){
            if(i % i == 0 && i != 2){
                isprime = false;
                break;
            }
        }
        if (isprime) {
            CONTADOR++;
        }

    }
}
CONTADORTHREADEXECUTADA++;
return 1;
} 
int main(int argc, char *argv[ ] ) {
int number1 =  atoi(argv[1]);
int number2 = atoi(argv[2]);
int dif = number2-number1;
thread** vec = new thread*[THREADNUMBER];
cout<< "criando threads" <<endl;
int contadorthread = 0;
if (dif <= THREADNUMBER) {
    for(int i = number1; i <= number2; i++) {
        thread* t = new thread(primeRange(i,i));
        vec[contadorthread] = t; 
        contadorthread++;
    }
} else {
    int c = dif / THREADNUMBER;

    for(int i = number1; i <= number2; i+=(c+1)) {
        if (contadorthread==THREADNUMBER-1) {
            thread* t = new thread(primeRange(i,number2));
            vec[contadorthread] = t; 
            contadorthread++;
            break;
        }
        thread* t = new thread(primeRange(i,i+c));
        vec[contadorthread] = t; 
        contadorthread++;

    }
cout<<contadorthread << " threads criadas"<<endl;
cout<<"inicializando threads" <<endl;

while (CONTADORTHREADEXECUTADA < contadorthread) {
    cout<<contadorthread - CONTADORTHREADEXECUTADA << endl;
}
cout<< CONTADOR << "primos encontrados" <<endl;
} 
}

但每次我尝试在 64 Windows GCC 上编译时,我都会收到此错误消息,指出没有名为“type”的类型

我用这个编译

g++ -Wall -g -std=c++11 -pthread codigo.cpp -o exe -Wall

我能做什么? 我已经下载了他们说是线程安全的 mingw 版本。

【问题讨论】:

  • 请在问题帖子中添加确切的错误消息。如果错误消息包含行号,请在代码中显示该行。
  • 顺便说一句,您正在泄漏线程对象。为什么要使用所有这些 new 和裸指针?只需将普通的std::thread 对象直接放入std::vector
  • 请准确显示您正在使用的 mingw-w64 版本(我假设您实际上使用的是 mingw-w64 而不是 mingw)。其中一些实际上没有开箱即用的 std 线程支持
  • @MatteoItalia IMO 最好使用比std::thread 更高级别的抽象,例如packaged_taskasync
  • 此消息通常表示您正在尝试错误地实例化模板。 (这不是一个好的错误消息,但这就是模板现在的工作方式)。您的模板是 std::thread 构造函数。

标签: c++ multithreading


【解决方案1】:

声明

thread* t = new thread(primeRange(i,i));

调用函数 primeRange 并将 result(int) 传递给线程构造函数,这显然不是调用方式。而是使用:

thread* t = new thread(primeRange, i, i);

它将函数指针和参数传递给线程构造函数。

【讨论】:

  • 谢谢!我实际上从朋友那里得到了答案,但工作很忙。但它希望,再次感谢您。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多