我正在尝试使用boost :: asio创建一个有限的线程池类.但是我被困在某一点可以帮助我.
唯一的问题是我应该减少反击的地方?
代码无法按预期工作.
问题是我不知道我的线程何时完成执行以及我将如何知道它已经返回池中
#include <boost/asio.hpp>
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <stack>
using namespace std;
using namespace boost;
class ThreadPool
{
static int count;
int NoOfThread;
thread_group grp;
mutex mutex_;
asio::io_service io_service;
int counter;
stack<thread*> thStk ;
public:
ThreadPool(int num)
{
NoOfThread = num;
counter = 0;
mutex::scoped_lock lock(mutex_);
if(count == 0)
count++;
else
return;
for(int i=0 ; i<num ; ++i)
{
thStk.push(grp.create_thread(boost::bind(&asio::io_service::run, &io_service)));
}
}
~ThreadPool()
{
io_service.stop();
grp.join_all();
}
thread* getThread()
{ …Run Code Online (Sandbox Code Playgroud) 我想用光标从表中删除记录.我该怎么做?
我使用MSSQL 2008 Express这段代码不会删除#temp中的任何内容.我也尝试过当前的cursor_name不起作用.
这是我的示例代码:
use AdventureWorks
drop table #temp
select * into #temp from HumanResources.Employee;
declare @eid as int;
declare @nid as varchar(15);
DECLARE Employee_Cursor CURSOR FOR
SELECT A.EmployeeID, A.NationalIDNumber FROM #temp AS A
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@eid > 10)
BEGIN
delete from #temp where #temp.EmployeeID = @eid;
END
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
select * from #temp
Run Code Online (Sandbox Code Playgroud)
提前致谢
在我目前的项目中,我需要对大数据阵列进行操作.所以我做了一个愚蠢的测试来检查哪一个会更好,但在尝试下面的代码时我发现动态数组比静态数组慢得多为什么呢?或者我做错了什么?
这里是代码(我从这里删除矢量(执行等于动态)和增强数组(等于静态))
结果:静态8,动态7493
#include<iostream>
#include<vector>
using namespace std;
using namespace boost;
double arr_time;
double darr_time;
void arrr()
{
int arr[100000];
LARGE_INTEGER start,end;
QueryPerformanceCounter(&start);
for(int i=0 ; i <100000 ; ++i)
{
arr[i] = 10 ;
}
for(int i=0 ; i <100000 ; ++i)
{
int x = arr[i];
}
QueryPerformanceCounter(&end);
arr_time += (end.LowPart - start.LowPart);
}
void darr()
{
int *arr = new int[100000];
LARGE_INTEGER start,end;
QueryPerformanceCounter(&start);
for(int i=0 ; i <100000 ; ++i)
{
arr[i] = 10 ;
} …Run Code Online (Sandbox Code Playgroud) 我正在使用下面的查询来更新我的所有记录,但它从第二行开始更新如何修改它以从第1行进行更改?
我正在使用mssql 2008
我认为我不能@@FETCH_STATUS用作第一线,因为它是全球性的.
提前致谢
use vivdb
DECLARE @empno as int;
select @empno = 10;
DECLARE Employee_Cursor CURSOR FOR select * from emp
OPEN Employee_Cursor;
FETCH NEXT from Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
update emp set empno = @empno;
select @empno = @empno+1;
FETCH NEXT from Employee_Cursor
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用代码来测试同步化的boost条件变量,这段代码会同步.但它只显示4个值这里有什么问题?,我怎么能解决它?
在Windows 7上使用vs 2012
提前致谢.
#include <iostream>
#include <queue>
#include "boost\thread.hpp"
#include "boost\timer.hpp"
using namespace std;
int counter;
boost::mutex m;
boost::condition_variable CworkDone;
bool workdone = true;
bool procOn = true;
void display()
{
while (procOn == true)
{
boost::mutex::scoped_lock lock(m);
if (workdone)
{
cout<<counter<<endl;
CworkDone.notify_one();
workdone = false;
}
else
{
CworkDone.wait(lock);
}
}
}
void increment()
{
for(int i = 0 ; i <10 ; ++i)
{
boost::mutex::scoped_lock lock(m);
if (!workdone)
{
boost::this_thread::sleep(boost::posix_time::millisec(500));
++counter;
workdone = true;
CworkDone.notify_one();
} …Run Code Online (Sandbox Code Playgroud)