简体   繁体   中英

pthread_create passing in dynamic vector array into argument

how do I cast a void pointer vector array into a vector array?

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

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

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

when passed in as argument (void)* vArray[1] it says invalid cast... And can pthread create take in more arguments, say 2, if the function takes 2 parameters? Thanks

Here's my complete code

#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 doesn't seem to be working now.. compiling it return me: too few arguments to function 'int pthread_join(pthread_t, void**)

After cleaning up your code:

#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;
}

You don't seem to be comfortable with

  • vectors
  • pointers and references
  • variable naming

Also, trying to shut the compiler up with static casts is a sure way to produce silly code.
The point is usually to make the code run, not to compile it at all cost.

Lastly, you can answer your own question about the number of parameters a posix thread can take by reading the manual

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM