- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,它将使用位操作评估竞争条件,然后还将使用信号量锁定/解锁来消除这些竞争条件。
我用“./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/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!