关于线程返回值的问题

wenjoy 2012-12-21 12:36:58
正在做一个数据处理的程序,出现这样一个问题。

最后会生成一个总的文件,文件里面是由若干数据组成,其中有两段数据是不相关的,所以我想用多线程来提高处理速度。但是呢,这两个数据要生成到一个文件内,且要求有先后顺序,请问多线程的返回值应该怎么处理,最好给个具体的代码实现,多谢各位。


ps: 楼下的大哥们可以拿这个举例子

我有两个方法
int func1 (int x,int y)
{ return x+y; }

int func2 (int x ,int y)
{return x*y;}

我希望用两个线程,分别执行两个方法,且把方法1的返回值存进 result 然后再把方法2 的返回值存进结果。

可行不?应该如何使用线程?谢谢
...全文
438 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2013-02-06
  • 打赏
  • 举报
回复
试试支持.NET2.0的fastCSharp
            fastCSharp.threading.task task = new fastCSharp.threading.task(2);
            Stopwatch w = new Stopwatch();
            w.Start();
            fastCSharp.runReturnValue<int> task1 = task.Add(() => Func1(4, 10));
            fastCSharp.runReturnValue<int> task2 = task.Add(() => Func2(4, 10));
            task.Dispose(true);
            w.Stop();
            Console.WriteLine("{0} {1}\t time: {2}", task1.Return, task2.Return, w.ElapsedMilliseconds);
threenewbee 2012-12-25
  • 打赏
  • 举报
回复
也许网络通讯是瓶颈。要看你的程序才知道。
wenjoy 2012-12-25
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
引用 8 楼 wenjoy 的回复:我分别 在 两个 函数 开始 和 结尾 都记录 了 时间 ,两个函数的开始时间和结束的时间 都 基本一样,这说明了什么 ?都是一起开始 一起 结束的。。。 你在计算中有没有lock对象?有没有额外的同步,有没有大量的IO访问?你的电脑有几个处理器核心?
是双核的电脑,没有使用lock ,也没有额外的同步,不是大量的io访问,但是有大量的抓取网页。 但是是抓取的两个不相关的网站。所以我才想用多线程
threenewbee 2012-12-24
  • 打赏
  • 举报
回复
引用 8 楼 wenjoy 的回复:
我分别 在 两个 函数 开始 和 结尾 都记录 了 时间 ,两个函数的开始时间和结束的时间 都 基本一样,这说明了什么 ?都是一起开始 一起 结束的。。。
你在计算中有没有lock对象?有没有额外的同步,有没有大量的IO访问?你的电脑有几个处理器核心?
wenjoy 2012-12-24
  • 打赏
  • 举报
回复
我分别 在 两个 函数 开始 和 结尾 都记录 了 时间 ,两个函数的开始时间和结束的时间 都 基本一样,这说明了什么 ?都是一起开始 一起 结束的。。。
wenjoy 2012-12-24
  • 打赏
  • 举报
回复
版主:我的程序又有 新问题了。。 照你的写的 我分别测试了 task1 ,2和 总的时间 ,如下 //总时间252378 task2 140757 task1 91643 Stopwatch w = new Stopwatch(); w.Start(); Task<string> task1 = Task.Factory.StartNew(() => plresult(match)); Task<string> task2 = Task.Factory.StartNew(() => pkresult(match)); Task.WaitAll( task1); w.Stop(); 为什么 不像想象的是 140757呢?时间是累加的 ?
threenewbee 2012-12-21
  • 打赏
  • 举报
回复
真正的并发是(假设两个程序各自独立,没有额外的同步,并且你的系统有2个CPU),一个程序用8秒,一个程序用6秒(比如我的例子),最终耗时应该是8秒(取长者),而不是14秒。 我的程序运行耗时8.008秒,和理论值基本相符。
threenewbee 2012-12-21
  • 打赏
  • 举报
回复
你可以搜索 .NET 4.0 TPL 查找相关资料。 另外2L的程序我再说下,他给两个线程做同步,两个线程根本不是并发执行,所以和单线程程序性能一样,那还不如直接用单线程好了。如果你要不用TPL,也应该使用一个信号量,而不是互斥。
wenjoy 2012-12-21
  • 打赏
  • 举报
回复
非常感谢楼上两位,问题已解决,已给分! 另:版主能介绍一下 Task.Factory 工厂模式么。。以前没用过,非常感谢了!!
threenewbee 2012-12-21
  • 打赏
  • 举报
回复
引用 2 楼 dufanfance1115 的回复:
C/C++ code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include "stdafx.h"#include <windows.h>int tickets=100;HANDLE hmutex;……
毫无意义的代码。
烦死 2012-12-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <windows.h>
int tickets=100;
HANDLE hmutex;
DWORD WINAPI Function1( LPVOID lpParameter );
DWORD WINAPI Function2( LPVOID lpParameter );

int result=0;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hthread1,hthread2;
hmutex=CreateMutex(NULL,TRUE,"Tickets");
hthread1=CreateThread(NULL,0,Function1,NULL,0,0);
hthread2=CreateThread(NULL,0,Function2,NULL,0,0);
CloseHandle(hthread1);
CloseHandle(hthread2);
printf("Main is running\r\n");
ReleaseMutex(hmutex);
Sleep(4000);
getchar();
return 0;
}

int func1 (int x,int y)
{ return x+y; }

int func2 (int x ,int y)
{return x*y;}

DWORD WINAPI Function1( LPVOID lpParameter )
{

WaitForSingleObject(hmutex,INFINITE);

result=func1(3,6);
printf("The function1 result is %d\r\n",result);
ReleaseMutex(hmutex);
while(1)
{
Sleep(1000);
}

return 0;
}

DWORD WINAPI Function2( LPVOID lpParameter )
{

WaitForSingleObject(hmutex,INFINITE);
result=func2(7,8);
printf("The function2 result is %d\r\n",result);
ReleaseMutex(hmutex);
while(1)
{
Sleep(1000);
}
return 0;
}


threenewbee 2012-12-21
  • 打赏
  • 举报
回复
C# 4.0很简单:
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static int Func1(int x, int y)
        {
            Thread.Sleep(8000);
            return x + y;
        }

        static int Func2(int x, int y)
        {
            Thread.Sleep(6000);
            return x * y;
        }

        static void Main(string[] args)
        {
            Stopwatch w = new Stopwatch();
            w.Start();
            Task<int> task1 = Task.Factory.StartNew(() => Func1(4, 10));
            Task<int> task2 = Task.Factory.StartNew(() => Func2(4, 10));
            Task.WaitAll(task1, task2);
            w.Stop();
            Console.WriteLine("{0} {1}\t time: {2}", task1.Result, task2.Result, w.ElapsedMilliseconds);
        }
    }
}
14 40 time: 8008 Press any key to continue . . .

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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