我对boost :: threads很新,我阅读了文档,但是我在实践中应用它时遇到了一些麻烦,也许你可以帮忙吗?首先,我花时间编写了一个自包含的代码清单,演示了两种我无法理解的行为......
该程序允许用户发出3个不同的命令,
目的是任务将在新线程上启动一些工作,但在执行工作时返回到命令提示符.用户可以使用info命令找出哪些任务已完成,哪些未完成.
我使用双核Win7机器和Visual Studio 2008 Express.
问题1>
发出命令,任务p1 p2 p3,启动3个任务正在运行.这可以通过发布信息来检查.几秒钟后,工作完成,但由于某种原因,完成的标志并不总是在1或2个任务上设置为true.
问题2>
退出程序然后生成以下消息:
Windows在example.exe中触发了断点.这可能是由于堆的损坏,这表示example.exe或它已加载的任何DLL中的错误.这也可能是由于用户在example.exe具有焦点时按下F12.输出窗口可能包含更多诊断信息.
希望您可以重现此行为并提供帮助.
提前致谢.亚历克斯.
//WARNING: THIS CODE DOES NOT BEHAVE EXACTLY AS INTENDED
#include <iostream>
#include <string>
#include <sstream>
#include <boost/thread.hpp>
using namespace std;
class task {
public:
string mname;
bool completed;
void start()
{
int a = 0;
for (int i=0 ; i<10000; i++)
{
for (int j=0 ; j<100000; j++)
{
a= i*2; …
Run Code Online (Sandbox Code Playgroud) 有人可以让我摆脱我的痛苦并告诉我为什么在用数组初始化数组时会出现访问冲突?
#include <stdio.h>
void initData(float **data, size_t N)
{
int i;
*data = (float*)malloc( N * sizeof(float) );
for (i=0; i<N; i++)
{
*data[i] = 1.0;
}
}
void main()
{
float *data;
initData(&data,8);
}
Run Code Online (Sandbox Code Playgroud) 以下C#NAudio代码与MATLAB产生的结果相差4倍。为什么会发生这种情况,其中之一是不正确的吗?
Complex[] tmp = new Complex[4];
tmp[0].X = 1.0f;
tmp[1].X = 0.5f;
tmp[2].X = 1.0f;
tmp[3].X = 0.25f;
tmp[0].Y = 0.0f;
tmp[1].Y = 0.0f;
tmp[2].Y = 0.0f;
tmp[3].Y = 0.0f;
FastFourierTransform.FFT(true, 2, tmp);
Run Code Online (Sandbox Code Playgroud)
NAUDIO输出:
0.6875 + 0.0000i
0.0000 - 0.0625i
0.3125 + 0.0000i
0.0000 + 0.0625i
Run Code Online (Sandbox Code Playgroud)
MATLAB输出:
2.7500 + 0.0000i
0.0000 - 0.2500i
1.2500 + 0.0000i
0.0000 + 0.2500i
Run Code Online (Sandbox Code Playgroud) 例如,我有一些由多个线程同时计算的工作.
出于演示目的,工作在while循环内执行.在单次迭代中,每个线程执行其自己的工作部分,在下一次迭代开始之前,计数器应该递增一次.
我的问题是每个线程都会更新计数器.
由于这似乎是一件相对简单的事情,我认为有一种"最佳实践"或常用方法可以解决这个问题?
下面是一些示例代码来说明问题并帮助讨论.(我使用提升线程)
class someTask {
public:
int mCounter; //initialized to 0
int mTotal; //initialized to i.e. 100000
boost::mutex cntmutex;
int getCount()
{
boost::mutex::scoped_lock lock( cntmutex );
return mCount;
}
void process( int thread_id, int numThreads )
{
while ( getCount() < mTotal )
{
// The main task is performed here and is divided
// into sub-tasks based on the thread_id and numThreads
// Wait for all thread to get to this point
cntmutex.lock();
mCounter++; // < …
Run Code Online (Sandbox Code Playgroud)