程序中线程的可并行性判断

熊熊爱吃饼 2012-08-04 05:12:27
本人在学习多线程编程,想问一下如何判断一个程序中的线程是否是可并行的?如下是我写的一个简易的加法程序:请诸位多多指教。谢谢了。


#include <windows.h>
#include<time.h>
#include <iostream>
using namespace std;

int a[1003];
DWORD WINAPI MyThread1(PVOID pvParam)
{
int i,j=0;
srand(time(0));
for(;j<1000;j++)
{
int t=rand()%10;
a[j]=t;
cout<<a[j]<<" ";
}
//生成1-10之间的随机数
return 0;
}

DWORD WINAPI SumThread1(PVOID pvParam)
{
int sum=0;
for(int i=0;i<350;i++)
{
sum+=a[i];
}
a[1001]=sum;
return 0;
}

DWORD WINAPI SumThread2(PVOID pvParam)
{
int sum=0;
for(int i=350;i<700;i++)
{
sum+=a[i];
}
a[1002]=sum;
Sleep(1000);
return 0;
}


DWORD WINAPI SumThread3(PVOID pvParam)
{
int sum=0;
for(int i=700;i<1000;i++)
{
sum+=a[i];
}
a[1003]=sum;
Sleep(1000);
return 0;
}
int main()
{
cout<<"随机数序列为:"<<endl;
HANDLE hThread1 = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);
Sleep(1500);
HANDLE hThread2 = CreateThread(NULL, 0, SumThread1, NULL, 0, NULL);
HANDLE hThread3 = CreateThread(NULL, 0, SumThread2, NULL, 0, NULL);
HANDLE hThread4 = CreateThread(NULL, 0, SumThread3, NULL, 0, NULL);
Sleep(1000);
int sum;
sum=a[1001]+a[1002]+a[1003];
cout<<"Then,The total sum will gona be:"<<sum<<endl;
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
return 0;
}


...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyandcode 2012-08-06
  • 打赏
  • 举报
回复
竟然是多线程用互斥或事件都可以。
titer1 2012-08-06
  • 打赏
  • 举报
回复
改天有空把代码贴上。。
titer1 2012-08-06
  • 打赏
  • 举报
回复
原以为是 1个生产者,3个消费者,1000个缓冲区问题。
不然,
三个消费者 处理的数据不需要互斥。

这里需要 生产者 和消费者需要同步
第二个就是 消费者完后,才计算,需要同步,

我的理解如此
titer1 2012-08-06
  • 打赏
  • 举报
回复
看了第一眼,觉得题目是 典型的 生产者 消费者的变形问题

给点伪代码

int main()
{

//建立1个event事件同步量,初始状态时 自动,默认不启动

cout<<"随机数序列为:"<<endl;
HANDLE hThread1 = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);//在线程结束时激活event

Sleep(1500);//用了event,所有sleep可以取消

HANDLE hThread2 = CreateThread(NULL, 0, SumThread1, NULL, 0, NULL);//线程开始时,waitforsingleobject()那个event,其他2个线程同样
HANDLE hThread3 = CreateThread(NULL, 0, SumThread2, NULL, 0, NULL);
HANDLE hThread4 = CreateThread(NULL, 0, SumThread3, NULL, 0, NULL);

Sleep(1000);//取消sleep,变成waitformultibleobject 等到所有线程返回为止。
int sum;
sum=a[1001]+a[1002]+a[1003];
cout<<"Then,The total sum will gona be:"<<sum<<endl;
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
return 0;
}
ohayou 2012-08-06
  • 打赏
  • 举报
回复
弄个队列不就得了?另外生成随机数明显要比累加要慢,你这线程数分配不合理。
熊熊爱吃饼 2012-08-06
  • 打赏
  • 举报
回复
关键是题目有限制的,就是要求是用多线程进行操作的,用4个线程实现1000个随即数的加法,这样一个题目:要求是用一个线程生成随机数,另外3个线程实现加法,求指教,要求4个线程必须并行。那应该是怎样设计才好、、?
xiaohuh421 2012-08-05
  • 打赏
  • 举报
回复
1. 多个线程考虑会不会同时访问某些相同的数据,这样数据能不能同时访问.(访问包括: 修改 和读取)
2. 多个线程之间有没有相互协作关系,比如线程1要等线程2完成某项工作才能继续做某些事
3. 其它. 后面的补充
熊熊爱吃饼 2012-08-05
  • 打赏
  • 举报
回复
关键是线程1的结束我是通过人为指定时间的Sleep(2000);这样明显4个进程不能并行啊,线程1是不能和后面3个进程并行的
IVERS0N 2012-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

比如我要用4个线程实现1000个随即数的加法,要求4个线程并行这可行么?(其中线程1是用来生成随机数的)
[/Quote]

多核CPU当然可行啦
熊熊爱吃饼 2012-08-05
  • 打赏
  • 举报
回复
比如我要用4个线程实现1000个随即数的加法,要求4个线程并行这可行么?(其中线程1是用来生成随机数的)

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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