如何创建多个同名线程并各自运行!!!~有用......

shinefen 2009-07-07 12:35:00
在MFC中我需要如何的运行:

struct SP
{
int it;
int *src;
int **desc;
}

...

UNIT Treadabc(LPVOID pp)
{
SP *sp(SP*)pp;
...
}
void DLG::fun1()
{...
int *a=new int[3];
...
for(int i=1;i<5;i++)
{
SP *sp=new SP;
sp->it=i;
sp->src=a;
...
AfxBeginThread(Treadabc,pp);////////就想创建多个线程,各自运行

}
}
...

//////////////
//问题是好象只有得一个线程被创建..
而且
sp指针传递过去线程后,src和desc的值会失效..??
...全文
479 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinefen 2009-07-09
  • 打赏
  • 举报
回复
惟有加多个线程..做::WaitForSingleObject(eventEnd.m_hObject,INFINITE);//等待所有线程结束
shinefen 2009-07-08
  • 打赏
  • 举报
回复
有个很困惑问题:
全局声明:
volatile int iallthreads=0;
CEvent eventEnd;
CCriticalSection criticalSection;



如上的:
void DLG::fun1()
{...
int *a=new int[3];
iallthreads=5;
...
for(int i=1;i <5;i++)
{
SP *sp=new SP;
sp->it=i;
sp->src=a;
...
AfxBeginThread(Treadabc,pp);////////就想创建多个线程,各自运行

}

::WaitForSingleObject(eventEnd.m_hObject,INFINITE);//等待所有线程结束

}

///////////////


UNIT Treadabc(LPVOID pp)
{
SP *sp(SP*)pp;
...
criticalSection.Lock();
iallthreads--;
if(iallthreads==0)
eventEnd.SetEvent();

criticalSection.unLock();
return 1;
}


////////////////////////////////////

我在主线程中:
加了
::WaitForSingleObject(eventEnd.m_hObject,INFINITE);//等待所有线程结束
后,程序就象死锁了~不动;
按调试的全部中断;提示现程可能死锁,全部线程停止;
就提示停止在.上面那句代码上
oyljerry 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shinefen 的回复:]
有个问题

如果线程不断访问一个对话框的成员函数,和跟访问一个全局函数,会不会有什么分别的呢.
也就是要做好.对话框成员变量和全局变量写读的同步,,但对他们的局部变量不用理会吧?

控制同步的
用CEvent.Lock()好呢?
还是用CCriticalSection.Lock()好呢
[/Quote]
多个线程读写同一个变量,就需要同步,可以用CCriticalSection.Lock(),效率比较高
局部变量如果只属于每个线程自己,就不用理会同步
shinefen 2009-07-08
  • 打赏
  • 举报
回复
有个问题

如果线程不断访问一个对话框的成员函数,和跟访问一个全局函数,会不会有什么分别的呢.
也就是要做好.对话框成员变量和全局变量写读的同步,,但对他们的局部变量不用理会吧?

控制同步的
用CEvent.Lock()好呢?
还是用CCriticalSection.Lock()好呢
shinefen 2009-07-07
  • 打赏
  • 举报
回复
线程名~都叫.Treadabc

如果不用MFC的线程
用C++的线程可以的吗?
我没试过
sunshine502 2009-07-07
  • 打赏
  • 举报
回复
同名?!
  • 打赏
  • 举报
回复
另外即使你所说的多个同名线程是像你这样子创建的,这个没有问题的。
  • 打赏
  • 举报
回复
线程本身可能会有问题,该循环
for(int i=1;i <5;i++) 
{
SP *sp=new SP;
sp->it=i;
sp->src=a;
...
AfxBeginThread(Treadabc,pp);////////就想创建多个线程,各自运行

}

使所有的线程参数的结构体的指针sp->src指向了同一块堆内存,如果是这样的话,是不是应该加上个线程同步控制。
雪影 2009-07-07
  • 打赏
  • 举报
回复
这样创建的线程是可以运行的,没看什么问题。

另外你的线程函数Treadabc中的参数指针指向同一个数据资源,
如果各个线程仅仅是读数据的话,应该不会有什么问题的。
如果涉及写、删除的话,就不好控制了。
w29468 2009-07-07
  • 打赏
  • 举报
回复
这样是可以运行的,没有问题
蒋晟 2009-07-07
  • 打赏
  • 举报
回复
线程是windows里面的对象,C++里面没有
用多个线程的话,最好创建一个线程池

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧