- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Tutorials Point 上使用 pthread 在 C++ 中学习多线程(它可能很旧,但我只需要一些东西来开始)。我稍微修改了代码:
#include <pthread.h>
#include <iostream>
#include <string>
#define NUM_THREADS 5
#define DEBUG
#undef DEBUG
using namespace std;
struct thread_data {
int thread_id = 0;
string message = "";
};
void *printHello(void *threadData)
{
struct thread_data* data = (struct thread_data*)threadData;
int thread_id = data->thread_id;
string message = data->message;
cout << "From thread " << thread_id << ": " << message << "\n";
pthread_exit(NULL);
}
int main(int argc, char** argv)
{
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
struct thread_data* data = new thread_data();
string message = "Special message for thread #" + to_string(i) + "!";
#ifdef DEBUG
cout << "DEBUG: " << "i = " << i << endl;
#endif
data->thread_id = i;
data->message = message;
cout << "main(): creating thread, " << i << endl;
int rc = 0;
rc = pthread_create(&threads[i], NULL, printHello, (void *) data);
delete data;
if (rc) {
cout << "Error: unable to create thread: " << rc << "\n";
return -1;
}
}
pthread_exit(NULL);
}
我编译了:
g++ -pthread -g -Wall -std=c++11 main.cpp -o main
输出是:
main(): creating thread, 0
main(): creating thread, 1
From thread 1: Special message for thread #1!
main(): creating thread, 2
From thread 2: Special message for thread #2!
main(): creating thread, 3
From thread 3: Special message for thread #3!
main(): creating thread, 4
From thread 4: Special message for thread #4!
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
Aborted (core dumped)
如果我不使用 pthread_create
创建线程并直接调用 printHello 函数,则不会发生错误。有时,程序反而会抛出段错误,有时却运行得很顺利!
另一个问题是,从一开始就应该有一行说From thread 0: Special message for thread #0!
,但是没有。
此外,有时会出现消息“线程#n 的特殊消息!”甚至根本没有出现。
我尝试在第 31 行初始化结构变量,使用静态分配的内存(堆栈而不是堆,不使用 new
)。我尝试避免在 printHello 函数中使用指针,但自从上次pthread_create 的参数只接受指向函数参数的指针,我不能那样做。
我首先怀疑是赋值data->message = message
时有问题,所以我尝试将字符串直接赋值给data->message
,但是没有运气。但我仍然认为错误必须存在,因为异常是 std::length_error
,由“basic_string”抛出。
或者,也许当我将 data
传递给 pthread_create
时,或者当我在第 18 行进行转换时,我做错了什么。我的想法是,当我将它传递给函数时,我将它作为指针传递,将其转换为空指针 void *
。当 printHello
收到参数时,我将其转换为 thread_data*
类型,这是一个指针,这是它原来的样子。
那是我到目前为止能够想出的时间。如果我的文章中有什么晦涩的地方请评论(英语不是我的母语)。
提前谢谢大家。
最佳答案
您将在创建线程后立即删除 data
。这意味着无法保证 data
指针在线程尝试访问它时仍指向事件对象。
您应该只在没有人打算再使用该对象时才删除data
。例如。线程完成后(您可以使用 pthread_join
来实现,例如)。
关于C++ 多线程 : terminate after throwing an instance of 'std::length_error' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38262948/
我一直在尝试配置 Terminator 以尊重我的终端的大小。这可能吗?事实上,每次我重新打开 Terminator 时,我都必须将几个终端的大小调整为我想要的配置。 首选项似乎没有配置这个选项。它似
我正在尝试通过命令在 Mac Catalina 10.15.5 中自动添加 crontab: echo -e "* * * * * \run.sh"|crontab - 此命令复制 crontab -
我有一堆名为1.png,2.png等的png文件,我想从它们全部创建一个动画gif图像。我尚未成功找到将这些png文件转换为单个gif动画的终端命令的解决方案。 有人可以发布一些我可以尝试的命令吗?我
我正在运行 dup1 example来自 The Go Programming Language本书(相关代码如下所示): for input.Scan() { counts[input.Te
有没有办法从命令行启动 gnome-terminal(即,使用/usr/bin/gnome-terminal 命令)并让新终端继承运行命令的终端的环境变量和其他设置变量?场景是这样的: 打开终端 设置
每次我打开终端时,我都会收到这样的信息: bash: /usr/local/Cellar/nvm/0.33.0/nvm.sh: No such file or directory 我试过重新加载。不知
如何更改背景颜色?我选择了 Profile > Background > solid color ,但我在哪里可以选择颜色? 最佳答案 有两种受支持的方法可以更改 xterm 的背景颜色(请记住 xt
我知道我可以右键单击 > 打开选项卡以在 gnome-terminal 中打开一个新选项卡,但是如何从脚本中执行相同操作?如果我使用 'gnome-terminal --tab-with-profil
安装 OSX Lion 后,我尝试: nano /etc/apt/sources.list 但我收到此错误: Error opening terminal: xterm-256color 如果我尝试切
所以我创建了一个名为 specs 的 mysql 表,我想将一个 csv 文件导入到该表中。 CREATE TABLE specs ( `Id` INT NOT NULL, `Brand` V
我正在运行 Xubuntu 13.04,我想使用 Vim 作为我所有的默认编辑器。我下载了很多vim配色方案试了一下,但是都不像官方截图。 例如,vim 自带的颜色模式——沙漠应该是这样的: 但在我的
我在 Mac OS Big Sur 上安装了 Spyder 5。 我从终端运行了这个命令:conda install spyder-terminal -c spyder-ide该命令运行无误。仍然没有
ssh -t remotehost vim /tmp/x.txt 我知道我可以运行上面这样的命令。 但我希望能够在远程计算机上运行任何本地 bash 代码。因此,我想调用远程“bash -s”,以便可
我正在尝试在我的内容管理系统中创建一项功能,用户可以上传 CSV 文件,然后解析该文件并将数据放入 MySQL 数据库中。为此,我使用文件输入和 SQL 查询。 $sql = "LOAD DATA L
我在 .inputrc 上发现了很多问题,答案包括使用 Mac OS X terminal.app 的人。 但是我已经设置了这个属性并且它没有改变 readline 的行为。我在 Ubuntu 上尝试
我正在尝试绘制由 rpart 生成的回归树使用 partykit .假设使用的公式是 y ~ x1 + x2 + x3 + ... + xn .我想要实现的是在终端节点中带有箱线图的树,顶部有一个标签
在 Visual Studio Code 中,Ctrl-k 快捷键绑定(bind)到 clearing the terminal . 我已经configured bash as my terminal
我正在学习斯坦福大学 Andrew Wu 教授的精彩机器学习类(class)。当我在 ex5 文件中执行绘图函数时,octave cli 命令行报告以下警告: set terminal aqua en
我在 Ubuntu 上使用 Python 3.6 的多处理来处理与另一台设备的更快通信。 我设置 daemon = True 以在父进程完成时终止子进程。但是,当主进程终止时,另一个进程(以下代码中的
我有一个 ant 任务,它使用 执行冗长的构建操作. Ant 由 Windows 命令行中的批处理文件启动。如果我通过关闭窗口来终止 ant 任务,则进程由 启动继续运行。当 ant 进程本身终止
我是一名优秀的程序员,十分优秀!