相关疑难解决方法(0)

VC++ 11中的std :: thread类导致随机崩溃.任何解决方法?

我在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)

c++ multithreading stl visual-c++ visual-c++-2012

5
推荐指数
1
解决办法
3103
查看次数

与cout和printf的区别在于c ++中的多线程

一些背景:

我有一个使用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)

c++ printf multithreading semaphore cout

4
推荐指数
1
解决办法
1892
查看次数

为什么有些线程被推迟了?

在我关注的教程中,作者编写了一个程序,该程序显示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++ multithreading c++11

4
推荐指数
1
解决办法
476
查看次数

C++ 程序在输入到控制台时停止生成控制台输出

我有一个 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++ console interaction output

4
推荐指数
1
解决办法
1540
查看次数

为什么std :: cout在线程中被抢占但是printf不是?

我开始学习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++ multithreading c++11

3
推荐指数
1
解决办法
795
查看次数

在C++ 98中写一个单独的字符串来cout"线程安全"

我知道在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<<只调用一次的内容.

c++ multithreading c++98

3
推荐指数
1
解决办法
374
查看次数

交错执行两个while循环

我有两个传感器,我需要不断监测.两个传感器的内部工作是不同的,我需要不断检查,如下所示.

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等.

c++ pthreads while-loop

1
推荐指数
2
解决办法
724
查看次数

如何从不同的线程,OpenMP,C++写入文件

我使用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++ parallel-processing openmp

1
推荐指数
1
解决办法
2743
查看次数