テストード貼っとくぜ。スレッドが64までは正常動作する。


#include <tbb/concurrent_queue.h>
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 64
concurrent_queue<int> que;
int sum[N];

unsigned WINAPI fnc(void *n) {
int x, num=*(int*)n; delete n;
while(1) {
if( !que.try_pop(x) ) { Sleep(10); continue; }
if(x==-1) return 0;
sum[num]+=x; Sleep(rand()%5); }}

int main() {
HANDLE hd[N];
int n;
for(n=0; n<N; n++) sum[n]=0;
for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); }
for(n=0; n<=10000; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitForMultipleObjects(N, hd, TRUE, INFINITE);
for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; }
cout<<"総和 "<<sum[0]<<endl;
getchar(); }