pthread_create, передающий динамический векторный массив в аргумент

0

как я могу поместить векторный массив указателей void в векторный массив?

vector<string>* vArray = new vector<string[numThreads];

p_thread_create(&my_thread[1], NULL, &function, (void)* vArray[1]);

void* function (vector<string> vArray[])
{
 //?? casting?
}

когда передано как аргумент (void) * vArray [1], он говорит о некорректном приведении... И может ли pthread create взять больше аргументов, скажем 2, если функция принимает 2 параметра? благодаря

Здесь мой полный код

#include <iostream>
#include <iomanip>
#include <iterator>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <pthread.h>
#include <queue>

using namespace std;

int array[5] = { 0, 0, 0, 0, 0 };

void* readData(void* arg)
{

  string fileName = "Wisconsin.txt";
  cout << "HERE!"<< endl;
  ifstream cities(fileName.c_str());
  string line;
  while(!cities.eof()){
    getline(cities, line);
    if(line != "") {
      int commaPos = line.find(',');
      int popul = atoi(line.substr(commaPos + 2).c_str());
      int x = popul;
      if (x >= 1 && x <= 999)
        {
          array[0]++;
        } else
        if (x >= 1000 && x <= 9999)
          {
            array[1]++;
          } else
          if (x >= 10000 && x <= 99999)
            {
              array[2]++;
            } else
            if (x >= 100000 && x <= 999999)
              {
                array[3]++;
              } else
              if (x >= 1000000)
                {
                  array[4]++;
                }

    } // end of IF 
  }  // end of while 
}

int main()
{
  int numThreads;
  ifstream ifs("states.txt");
  std::string str((std::istreambuf_iterator<char>(ifs)),
                  std::istreambuf_iterator<char>());
  stringstream ss(str);
  int fileCount = 0;
  string fileName;
  while (ss >> fileName)
    {
      fileCount++;
    }
  cout << fileCount;

  string* filesArr = new string[fileCount];
  ss.clear();
  ss.seekg(0, std::ios::beg);
  for (int i = 0; i < fileCount; i++)
    {
      ss >> filesArr[i];
    }   

  cout << "Enter number of threads: ";
  cin >> numThreads;

  vector<string>* vArray = new vector<string>[numThreads];
  for (int i = 0; i < fileCount; i++)
    {
      vArray[i % numThreads].insert(vArray[i % numThreads].begin(), filesArr[i]);
    }

  //queue<string>* queueArr = new queue<string>[numThreads];
  //for (int i = 0; i < fileCount; i++)
    //  queueArr[i % numThreads].push(filesArr[i]);

  for(int i = 0; i < numThreads; i ++)
    {
      cout << endl;
      cout << "FOR THREAD " << i + 1 << ":" << endl;
      for (std::vector<string>::iterator it = vArray[i].begin(); it != vArray[i].end(); it++)
        {
          cout << *it << endl;

        }

    }


  pthread_t my_thread[numThreads];
  int ret = pthread_create(&my_thread[1], NULL, &readData, (void*)(vArray+1));
  /////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////
  ///////////// ERROR HERE!
  pthread_join(my_thread[1], ret);
  // for (int id = 0; id < numThreads; id++)
  //    {
  //}

  pthread_join(my_thread[1]);
  cout << endl;

  printf("%-20s", "1-999:");
  cout << array[0] << endl;

  printf("%-20s", "1,000 - 9,999:");
  cout << array[1] << endl;

  printf("%-20s", "10,000-99,999:");
  cout << (array[2]) << endl;

  printf("%-20s", "100,000-999,999:");
  cout << (array[3]) << endl;

  printf("%-20s", "1,000,000+:");
  cout << (array[4]) << endl;

  //int pos;
  //string token;
  //while ((pos = s.find(delimiter))

  cin.get();

  return 0;
}

pthread join, похоже, сейчас не работает. Скомпилирование его возвращает меня: слишком мало аргументов для функции 'int pthread_join (pthread_t, void **)

  • 1
    Попробуйте добавить в ваш пример скомпилированный код. Он полон опечаток и потребует от нас некоторого приближения, прежде чем дать правильный пример кода.
Теги:
multithreading
casting

1 ответ

2
Лучший ответ

После очистки кода:

#include <iostream>
#include <vector>
using namespace std;

const int numThreads = 10;

void * thread_body (void * param)
{
    // retrieve parameter
    string& prm = *(string *)param;

    // use it
    cout << prm << endl;

    return NULL;
}

int main() {
    vector<string   >threadPrm(numThreads);
    vector<pthread_t>threadId (numThreads);

    threadPrm[1] = "Hello";
    pthread_create(&threadId[1], NULL, thread_body, &threadPrm[1]);
    pthread_join (threadId[1], NULL);

    return 0;
}

Кажется, вам не нравится

  • векторы
  • указатели и ссылки
  • переменное именование

Кроме того, попытка закрыть компилятор статическими кастами - это верный способ создания глупого кода.
Дело, как правило, заключается в том, чтобы выполнить код, а не компилировать его любой ценой.

Наконец, вы можете ответить на свой собственный вопрос о количестве параметров, которые может принять поток posix, прочитав руководство

Ещё вопросы

Сообщество Overcoder
Наверх
Меню