怎样将C++代码改为多线程?

flybird70 2008-10-17 08:34:37
# include "dayin.h"

int main()
{
.........

dayin(B,C);

.........

return 0;

}

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

dayin(int B, int C)
{

for(int i=B,i<C,i++)
{
//--------------------------------代码区一
int a=0,b=0,c=0;

for(int j=0,j<100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout<<a+b+c<<endl;//1
//--------------------------------代码区二
a=0,b=0,c=0;

for( j=0,j<100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout<<a+b+c<<endl;//2
//--------------------------------代码区三
a=0,b=0,c=0;

for( j=0,j<100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout<<a+b+c<<endl;//3

}

return 0;

}

我想把代码区一、二、三分别改为三个线程函数,同时运行,
但是:
cout<<a+b+c<<endl;//1
cout<<a+b+c<<endl;//2
cout<<a+b+c<<endl;//3
这三处cout,按1、2、3的顺序分别打印。

请问,怎样改为多线程?谢谢!

...全文
365 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhsxsh 2008-10-31
  • 打赏
  • 举报
回复
楼上都说的很好,看了
strongpan 2008-10-31
  • 打赏
  • 举报
回复
EN ..

学习
疯石头 2008-10-29
  • 打赏
  • 举报
回复
晕菜 写完了感觉不对....判断应该是:
while(a == 0)
{
sleep()?..;
}
cout .....
疯石头 2008-10-29
  • 打赏
  • 举报
回复
主程序中创3个变脸分别存储3个线程反出的值
beginthread创建线程并执行相关代码
主程序中判断这3个变量如:
int a = 0;

...线程执行

while(a == 0)
{
cout .....
}
while(...)...
abcwangdragon 2008-10-25
  • 打赏
  • 举报
回复
_beginthreadex这个是C++运行库的吧。虽然它还是调用了WINDOWS的CREATETHREAD方法.
binjuny 2008-10-22
  • 打赏
  • 举报
回复
标准C++没有提供直接的线程操作方法,若是MSVC++,可以采用zhongyunde的方法,若是纯C++可以引用一些像BOOST的库来实现线程操作。
caitian6 2008-10-22
  • 打赏
  • 举报
回复
mark
cdef9108 2008-10-20
  • 打赏
  • 举报
回复
up,应该是在三楼的基础之上,加上线程同步把。
我在学习。
  • 打赏
  • 举报
回复
你把cout < <a+b+c < <endl;
放到主线程里做。。到所以线程结束了再输出。。或者再写个线程检测 3个子线程状态 然后按顺序输出
lirongjun1985 2008-10-20
  • 打赏
  • 举报
回复
上面说的不对 没看仔细哈。
方法还是用全局变量,线程都一起启动。只要把cout写到if里就可以了。
int i = 0;

if(0 == i) 线程1
{
cout<<
i++;
}

if(1 == i) 线程2
{
cout<<
i++;
}

if(2 == i) 线程3
{
cout<<
}
lirongjun1985 2008-10-20
  • 打赏
  • 举报
回复
弄个全局变量 i=0;

把3个线程函数的启动放到CASE里

switch(i)
{
case 0:启动线程1,并把i++
case 1:启动线程2,并把i++
case 2:启动线程3,
}
VsirSoft 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnzdgs 的回复:]
这是最基本的线程同步,可以用两个事件,由1、2线程来设置,2、3线程等待事件。
[/Quote]

up
scq2099yt 2008-10-20
  • 打赏
  • 举报
回复
up 3 floor
清钟沁桐 2008-10-18
  • 打赏
  • 举报
回复
一个完整示例程序如下:
#include <afxwin.h>
CWinApp TheApp;
UINT ThreadFunc(LPVOID);
int main()
{
CWinThread* pThreads[5];
for (int i=0; i<5; i++)
{
pThreads[i] = AfxBeginThread(
ThreadFunc,
(LPVOID)i,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED
);
ASSERT(pThreads[i]);
pThreads[i]->m_bAutoDelete = FALSE;
pThreads[i]->ResumeThread();
printf("Thread launched %d\n", i);
}

for (i=0; i<5; i++)
{
WaitForSingleObject(pThreads[i]->m_hThread, INFINITE);
delete pThreads[i];
}
return 0;
}

UINT ThreadFunc(LPVOID n)
{
for (int i=0;i<5;i++)
printf("%d%d%d%d%d%d%d%d\n",n,n,n,n,n,n,n,n);
for (int j=0;j<5000000;j++);
return 0;
}
cnzdgs 2008-10-17
  • 打赏
  • 举报
回复
这是最基本的线程同步,可以用两个事件,由1、2线程来设置,2、3线程等待事件。
SoftSoftSoft2008 2008-10-17
  • 打赏
  • 举报
回复
# include "dayin.h"

struct Two_Int
{
int B ;
int C ;
} ;

UINT myThread_1(LPVOID lpVoid) ;
UINT myThread_2(LPVOID lpVoid) ;
UINT myThread_3(LPVOID lpVoid) ;

int main()
{
.........

dayin(B,C);

.........

while(1)
Sleep(50) //这里可以改进,改为,3个线程全部完成任务后,再退出

return 0;

}

//线程1
UINT myThread_1(LPVOID lpVoid)
{
Two_Int* param = (Two_Int*)lpVoid ;
for(int i=param->B,i <param->C,i++)
{
//--------------------------------代码区一
int a=0,b=0,c=0;

for(int j=0,j <100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout < <a+b+c < <endl;//1
}
return 0 ;
}

//线程2
UINT myThread_2(LPVOID lpVoid)
{
Two_Int* param = (Two_Int*)lpVoid ;
for(int i=param->B,i <param->C,i++)
{
//--------------------------------代码区二
a=0,b=0,c=0;

for( j=0,j <100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout < <a+b+c < <endl;//2
}
return 0 ;
}

//线程3
UINT myThread_3(LPVOID lpVoid)
{
Two_Int* param = (Two_Int*)lpVoid ;
for(int i=param->B,i <param->C,i++)
{
//--------------------------------代码区三
a=0,b=0,c=0;

for( j=0,j <100,j++)
{
.........//耗时的不同运算
a= ;//a,b,c的值改变
b= ;
c= ;
.........
}
cout < <a+b+c < <endl;//3
}
return 0 ;
}

dayin(int B, int C)
{
Two_Int myInt ;
myInt.B = 50 ;
myInt.C = 60 ;
DWORD dwThrea1,dwThread2,dwThread3 ;
CreateThread(NULL,0,myThread_1,(LPVOID)&myInt,&dwThread1,0) ;
CreateThread(NULL,0,myThread_2,(LPVOID)&myInt,&dwThread2,0) ;
CreateThread(NULL,0,myThread_3,(LPVOID)&myInt,&dwThread3,0) ;

return 0;
}

Waiting4you 2008-10-17
  • 打赏
  • 举报
回复
简单点就用OpenMP吧,修改得少一点.
caixingxin 2008-10-17
  • 打赏
  • 举报
回复
你那耗时的不同运算应该都是不同的吧。。那就写成三个独立的线程函数,用一个全局变量表示轮到第几个输出了,如果没轮到自己的就先等一下

15,466

社区成员

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

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