我在Visual Studio 11开发人员预览版中遇到了一个错误,至少我认为这是一个错误并报告了它,但我很感兴趣是否有人知道解决方法.
当我使用std::thread类创建多个线程时,它会导致应用程序崩溃.有时它抛出异常,有时会导致访问冲突,有时它会起作用.重现错误的代码如下所示:
#include <iostream>
#include <thread>
#include <vector>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<std::thread*> threads;
for(int i = 0; i < 10; i++)
{
threads.push_back(new std::thread([i]
{
/*std::cout << "thread " << i << std::endl;*/
/* whatever else that is thread safe, or even an empty lambda */
}));
}
for(int i = 0; i < 10; i++)
{
threads[i]->join();
delete threads[i];
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
无论是使用静态CRT库还是动态CRT库都无关紧要(所有这些都是多线程的).
Stacktrace(抛出异常,解锁无主互斥锁):
test.exe!_NMSG_WRITE(int rterrnum) Line 217 …Run Code Online (Sandbox Code Playgroud) 一些背景:
我有一个使用pthreads多线程的c ++程序.该计划是一个酒店预订系统,有10位客人(每个人都有自己的主题),一个登记台(1个主题)和一个退房服务台(1个主题).酒店只有5间客房可供客人入住.我正在使用信号量在此计划中强制执行互斥和事件订购.
题:
这是我的代码(只是需要的部分......)
sem_init(&openRooms, 0, 5);
sem_wait(&openRooms); //waits for there to be an open room at the hotel
cout << "Guest " << guestNumber << " waits for check-in." << endl;
sem_wait(&checkInLine); //waits for an open spot at the check-in desk
Run Code Online (Sandbox Code Playgroud)
有5位客人可以同时入住酒店,因为这里有5间客房.当我运行程序时,我得到输出(或类似......)
Guest Guest Guest Guest 24 waits for check-in. waits for check-in.1 waits for check-in.
3 waits for check-in.
Run Code Online (Sandbox Code Playgroud)
似乎cout允许同时运行多个打印,这就是"Guest"连续多次打印的原因.
我试过用printf做这个,同样的问题不会发生.在另一个线程可以打印语句之前打印整个语句.
sem_wait(&checkInSt); //Only one person at check in receptionist at a time
printf("Guest %ld goes to the …Run Code Online (Sandbox Code Playgroud) 在我关注的教程中,作者编写了一个程序,该程序显示std::futures 的析构函数并不总是执行任务.在下面的程序中,创建的10个线程std::async()被移动到向量中,然后我们等待它们的析构函数运行.
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int main()
{
std::cout << "Main thread id: " << std::this_thread::get_id() << std::endl;
std::vector<std::future<void>> futures;
for (int i = 0; i < 10; ++i)
{
auto fut = std::async([i]
{
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << std::this_thread::get_id() << " ";
});
futures.push_back(std::move(fut));
}
}
Run Code Online (Sandbox Code Playgroud)
结果取决于机器,但我们发现在析构函数运行时只启动了6个线程(我们在主线程id输出后只打印了6个ID).这意味着其他四个被延迟,并且延迟线程在std::future析构函数期间不会运行.
我的问题是为什么有些线程被迫执行而其他线程被推迟.如果生命std::future结束,那么推迟他们的意义何在?
我有一个 C++ 程序(MSVC 2017),它通过 std::cout 不断输出调试信息。然而,有时当我与控制台进行物理交互时(例如意外点击它),它会停止产生输出。这意味着没有打印任何内容,尽管程序继续运行并完成正确执行的任何操作。
任何想法如何解决这一问题?使用“std::cout.setf(std::ios::unitbuf);”删除 std::cout 缓冲区 没有效果。
样本:
#include <iostream>
int main()
{
int i = 0;
while (true) {
i++;
if (i%100000000 == 0) std::cout << i++ << "\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我开始学习C++ 11标准中的线程,我正在尝试一个非常基本的程序,它创建10个线程,加入它们然后退出.在线程函数中,我试图打印出我正在创建线程的for循环的索引,如下所示:
std::vector<std::thread> threads;
for(int i = 0; i < 10; i++)
{
threads.push_back(std::thread([i](){ printf("Thread #%d\n", i); }));
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个预期来自并发程序的输出,线程执行顺序:
Thread #0
Thread #2
Thread #1
Thread #3
Thread #4
Thread #5
Thread #6
Thread #7
Thread #8
Thread #9
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用std::cout和做同样的事情时std::endl,我得到了这个:
Thread #0
Thread #Thread #2
Thread #3
Thread #9
1
Thread #8
Thread #4
Thread #5
Thread #7
Thread #6
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况std::cout而不是发生printf?
我知道在C++ 98中严格说来没有什么是线程安全的,因为在标准中,在C++ 11之前没有线程.但是,在实践中,早在C++ 11之前就已经在C++中使用了线程.
所以让我们两个pthreads同时称之为:
void printSomething(){
std::cout << "something\n";
}
Run Code Online (Sandbox Code Playgroud)
什么可以导致两个输出交错?或者我会在实践中总是两行包含"某些东西"吗?
...在C++ 11中,std :: cout是线程安全的.
但这个答案提供了一个例子
std::cout << "aaaaaaaaaa" << "bbbbbbbbbb";
Run Code Online (Sandbox Code Playgroud)
并得出结论,在C++ 98中,执行此操作的两个线程可能具有交错输出,但我找不到任何关于两个线程operator<<只调用一次的内容.
我有两个传感器,我需要不断监测.两个传感器的内部工作是不同的,我需要不断检查,如下所示.
int sensorA(){
while (true) {
// read sensor A
cout<<"sensorA \n";
}
}
int sensorB(){
while (true) {
// read sensor B
cout<<"sensorB \n";
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何确保以交错方式读取两个传感器?像读传感器A然后传感器B然后传感器A等.
我使用openMP来并行我的C++程序.我的并行代码具有非常简单的形式
#pragma omp parallel for shared(a, b, c) private(i, result)
for (i = 0; i < N; i++){
result= F(a,b,c,i)//do some calculation
cout<<i<<" "<<result<<endl;
}
Run Code Online (Sandbox Code Playgroud)
如果两个线程同时尝试写入文件,则数据会混淆.我怎么能解决这个问题?
c++ ×8
c++11 ×2
c++98 ×1
console ×1
cout ×1
interaction ×1
openmp ×1
output ×1
printf ×1
pthreads ×1
semaphore ×1
stl ×1
visual-c++ ×1
while-loop ×1