Дамп ядра в многопоточной программе: basic_string :: _ S_construct null недействительно

Я хочу, чтобы 4 темы входили в одну и ту же функцию с именем read и делать то, что есть в функции (читать, после нее печатать на мониторе и показывать все это …).
Эта проблема:

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_S_construct null not valid
trAborted (core dumped)

Код является:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;

struct v {
int id;
char* ad;

v(int a, char* t) {
id = a;
ad = t;
}
};

int bank = 1000;
pthread_mutex_t mutex;

void* read(void* argument)
{
cout << "tr";
v* d;
int num;
d = (v*) argument;
string l = d->ad;
int n = d->id;
string x = "";
ifstream textfile;
textfile.open(l.c_str());
while (!textfile.eof()) {
textfile >> x;
if (x == "SUB") {
pthread_mutex_lock(&mutex);
textfile >> num;
bank = bank - num;
cout << "person num " << n << " sub " << num << " dollars and know in the Bank: " << bank << endl;
pthread_mutex_unlock(&mutex);
}
if (x == "ADD") {
pthread_mutex_lock(&mutex);
textfile >> num;
bank = bank + num;
cout << "person num " << n << " add " << num << " dollars and know in the Bank: " << bank << endl;
pthread_mutex_unlock(&mutex);
}
if (x == "GET") {
pthread_mutex_lock(&mutex);
cout << "person num " << n << " look in the Bank: " << bank << endl;
pthread_mutex_unlock(&mutex);
}}
textfile.close();
return 0;
}

int main(void)
{
pthread_mutex_init(&mutex, NULL);
int i = 0, j = 0;
v data1(1, "file1.dat"), data2(2, "file2.dat"), data3(3, "file3.dat"), data4(4, "file4.dat");
pthread_t t1, t2, t3, t4;
i = pthread_create(&t1, NULL, read, (void*)&data1);
if (i != 0) cout << "error" ;
j = pthread_create(&t2, NULL, read, (void*)&data2);
if (j != 0) cout << "error" ;
i = pthread_create(&t3, NULL, read, (void*)&data3);
if (i != 0) cout << "error" ;
j = pthread_create(&t4, NULL, read, (void*)&data4);
if (j != 0) cout << "error" ;

pthread_exit(NULL);

return 0;
}

0

Решение

Вы передаете данные своих потоков в стек, что почти никогда не является хорошей идеей.

Когда вы звоните pthread_exit, стек основного потока, который содержит dataN объекты, освобождается. Если один из ваших потоков запланирован после pthread_exit, он будет работать на освобожденных объектах.

Лучшее решение — выделить свой data объекты в куче через new,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]