gpt4 book ai didi

c++ - C++中的字符串逻辑错误

转载 作者:行者123 更新时间:2023-11-30 03:58:40 26 4
gpt4 key购买 nike

我正在编写一个程序,它将使用位操作评估竞争条件,然后还将使用信号量锁定/解锁来消除这些竞争条件。

我用“./raceTest 5 6 3 6 unlock”正常运行程序。所有的输出过去都很好。但现在它因解锁 arg 而崩溃。

当我尝试使用这些参数编译时,我的程序崩溃了:./raceTest 5 6 3 6 lock(或任何带有“lock”的参数)

这是就输出与“锁定”命令一起进行的而言。它现在以这种方式崩溃......即使它没有因“解锁”而崩溃并且正确显示所有内容。

./raceTest 5 6 3 6 lock
lock
nBuffers is 5
mWorkers is 6
sleepMin is 3
sleepMax is 6
randarray 4
randarray 3
randarray 6
randarray 3
randarray 4
randarray 4
Segmentation fault

我曾尝试使用 gdb,当我运行该程序时,我从 gdb 得到了这个错误

Starting program: /mnt_nfs/home3/ugrad3/ariley/Desktop/cs361/hw5/raceTest
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaaab000
[Thread debugging using libthread_db enabled]
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid

Program received signal SIGABRT, Aborted.
0x0000003156430265 in raise () from /lib64/libc.so.6

谁能告诉我这是什么意思?它在早些时候工作。但现在它不起作用,我没有对它做任何事情......

// raceTest program
#include <string>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/stat.h>

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun
{
int val; // value for SETVAL
struct semid_ds *buf; // buffer for IPC_STAT, IPC_SET
unsigned short *array; // array for GETALL, SETALL
struct seminfo *_buf; // buffer for IPC_INFO
};
#endif

static int sem_id = 0;
static int sem_semvalue();
static void del_semvalue();
static int semaphore_p();
static int semaphore_v();

using namespace std;

// struct for the threads
typedef struct thread
{
int nbuffers;
int ID;
double sleepTime;
int semID;
int mutexID;
int *buffer;
int nReadErrors;
} Thread_data;

void *worker(void *targ)
{
cout << "In worker function" << endl;
// cast back to a struct variable to use
Thread_data *data = (Thread_data*) targ;

int errors=0;

for (int i=0 ; i < data->nbuffers; i++)
{
// READ the value of buffers at that thread's ID, starting from current ID
int read = data->buffer[data->ID];
usleep(data->sleepTime);
// see if the value changed after sleeping
int secondRead = data->buffer[data->ID];
if (secondRead != read)
{
cout << " Worker " << data->buffer[data->ID] << " reported change from " << read << " to secondRead " << secondRead;
cout << " in buffer " << i << endl;
errors ++;
}

read = (read + data->ID) % (data->nbuffers); // next read

usleep(data->sleepTime);
secondRead = data->buffer[read];
if (secondRead != read)
{
cout << " Worker " << data->buffer[data->ID] << "reported change from " << read << " to secondRead " << secondRead;
cout << " in buffer " << i << endl;
errors ++;
}

// write operations to do
read = (read + data->ID) % (data->nbuffers);
usleep(data->sleepTime);
// add to the buffer array, or the WRITE
data->buffer[read] = secondRead + ( 1 << (data->ID - 1) );
}
data->nReadErrors = errors; // update 4.
pthread_exit(NULL);
}


int main (int argc, char * argv[])
{
int i; // handle all command line arguements
int nBuffers = 0;
int mWorkers = 0;
int sleepMin = 0;
int sleepMax = 0;
srand(time(NULL));
key_t key = IPC_PRIVATE;
int rErrors = 0;
int wErrors = 0;

// parse command line arguments
// USAGE: raceTest nBuffers nWorkers sleepMin sleepMax [ randSeed ] [ -lock | -nolock ]
for (i=1 ; i<argc-1 ; i++)
{
// Check input
string s = argv[i];
int num = atoi( s.c_str() ); // UPDATE 5
//cout << "argv at " << i << " is " << num << endl;

if (num == 0)
{
cout << "USAGE: raceTest nBuffers nWorkers sleepMin sleepMax [ randSeed ] [ -lock | - nolock ]" << endl;
cout << "Exiting..." << endl;
exit(-1);
}
}
string s = argv[i++];
cout << s << endl;

// set variables to command line arguments
// nBuffers has restrictions
nBuffers = atoi(argv[1]);
if ( nBuffers <= 2 || nBuffers >= 32)
{
cout << "nBuffers is the wrong size. Exiting" << endl;
exit (-1);

if (nBuffers != 3 || nBuffers != 7 || nBuffers != 11 || nBuffers != 17 || nBuffers !=5
|| nBuffers != 13 || nBuffers != 19 || nBuffers != 23 || nBuffers != 31 || nBuffers != 29)
{
cout << "nBuffers must be prime. Exiting" << endl;
exit (-2);
}
}

mWorkers = atoi(argv[2]); cout << "nBuffers is " << nBuffers << endl;
sleepMin = atoi(argv[3]); cout << "mWorkers is " << mWorkers << endl;
sleepMax = atoi(argv[4]); cout << "sleepMin is " << sleepMin << endl;
cout << "sleepMax is " << sleepMax << endl;

int buffers[nBuffers];
double randWorkers[mWorkers];

// initialize the arrays
for (int i=0 ; i<nBuffers ; i++)
buffers[i] = 0;

for (int i=0 ; i<mWorkers ; i++)
{
// generate random number between sleepMin and sleepMax
int temp = rand() % (sleepMax - sleepMin + 1) + sleepMin;
randWorkers[i] = temp;
cout << "randarray " << randWorkers[i] << endl;
}

// sort the numbers in decreasing order
for (int i=0 ; i<mWorkers ; i++)
{
for (int j=0 ; j< mWorkers ; j++)
{
if (randWorkers[i] < randWorkers[j])
{
cout << "here" << endl;
// simple sorting
double temp = randWorkers[i];
randWorkers[i] = randWorkers[j];
randWorkers[j] = temp;
cout << randWorkers[i] << " ";
}
}
}
// other sorting method
//sort (randWorkers, sizeof(randWorkers), greater<double>);

// create an array of M structs and populate each with values needed
// for the threads
Thread_data threadVals[mWorkers];

for (int i=0 ; i<mWorkers ; i++)
{
threadVals[i].nbuffers = nBuffers;
threadVals[i].ID = i+1;
threadVals[i].sleepTime = randWorkers[i];
threadVals[i].semID = -1;
threadVals[i].mutexID = -1;
threadVals[i].nReadErrors = 0;
threadVals[i].buffer = buffers;
}

// create an array of M (threads) where each runs the
// worker() function
pthread_t tid[nBuffers];

for (int i=0 ; i<mWorkers ; i++)
{
// don't do any locking
if ( strcmp (s.c_str(), "nolock") == 0)
{
// pass a pointer to one of the structs
int value = pthread_create (&tid[i], NULL, worker, &threadVals[i]);
if (value != 0)
{
perror ("thread creation failed");
exit(-3);
}
else
cout << "successful creation for " << tid[nBuffers] << endl;
}

// use semaphores for the locking
else if (strcmp(s.c_str() , "lock") == 0)
{
/*cout << "B-----" << endl;
int sem_id = semget(key, 1, IPC_CREAT|0666);
if (sem_id < 0)
{
perror ( "Cannot create sem_id");
exit(-5);
}
cout << "A-----" << endl; */
;
}
}

// wait for all of the threads to finish
for (int j=0 ; j<mWorkers ; j++)
{
pthread_join(tid[j], NULL);
}

for (int i=0 ; i< nBuffers ; i++)
{
int size = 2^ mWorkers - 1;
if (buffers[i] == size)
break; // this particular index is the same

cout << "Bad bits for buffer[" << i <<"] = " ;
int diff = size ^ buffers[i];
for (int j=0 ; j <mWorkers ; j++)
{
// perform a binary OR and then binary AND
int position = (diff) & (1<<j);
//cout << buffer[position] << W" ";
if (position)
cout << j << " " ;
wErrors++;
}
cout << endl;
}

// figure the total number of read errors
for (int i=0 ; i<mWorkers ; i++)
rErrors = rErrors + threadVals[i].nReadErrors;

cout << "Total Errors: " << "read errors: " << rErrors << " write errors " << wErrors << endl;
return 0;
}

编辑:这是我做bt的时候得到的,我怕是不太明白这玩意是什么意思……

Program received signal SIGSEGV, Segmentation fault.
0x000000315643471a in ____strtoll_l_internal () from /lib64/libc.so.6
(gdb) bt
#0 0x000000315643471a in ____strtoll_l_internal () from /lib64/libc.so.6
#1 0x0000003156431bd2 in atoi () from /lib64/libc.so.6
#2 0x00000000004010a5 in main (argc=1, argv=0x7fffffffded8) at raceTest.cpp:171
(gdb) up
#1 0x0000003156431bd2 in atoi () from /lib64/libc.so.6
(gdb)
#2 0x00000000004010a5 in main (argc=1, argv=0x7fffffffded8) at raceTest.cpp:171
171 nBuffers = atoi(argv[1]);
(gdb)
Initial frame selected; you cannot go up.
(gdb) print nBuffers
$1 = 0

第二次编辑:无论我只是为冲突线程还是使用信号量。我所做的唯一更改是将数组参数从 nBuffers 更改为 nWorkers,然后测试 rand 的输出以查看它是否产生未定义的行为。

[ariley@bert hw5]$ ./raceTest 5 6 3 6 lock
5
6
3
6
5beforenBuffers is 5
mWorkers is 6
sleepMin is 3
sleepMax is 6
value of temp4
randarray 4
value of temp6
randarray 6
value of temp3
randarray 3
value of temp5
randarray 5
value of temp4
randarray 4
value of temp6
randarray 6
successful creation for 6300416
In worker function
successful creation for 6300416
successful creation for 47840834492736
Segmentation fault

最佳答案

pthread_t tid[nBuffers];

应该是

pthread_t tid[mWorkers];

您不会初始化 tid[] 数组,除非参数集是“nolock”(而不是“unlock”),因此 pthread_join(tid[i], NULL) 使用无效参数调用。

标记。

关于c++ - C++中的字符串逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27311834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com