注册 登录
编程论坛 C++教室

[求助][讨论]如何使两个for并行执行?

ioriliao 发布于 2007-06-21 14:32, 1275 次点击

#include <iostream>

using namespace std;

int main()
{

for (int i=0; i<10; i++)
{
cout << "i = " << i << endl;
}

for (int k=0; k<10; k++)
{
cout << "k = " << k << endl;
}

cin.get();
return 0;
}


上面的程序是执行了 for (int i=0; i<10; i++)后再执行for (int k=0; k<10; k++)
有没有办法让他们并行执行.就是说一起执行...
18 回复
#2
wfpb2007-06-21 14:53
那只有多线程了。
#3
ioriliao2007-06-21 15:03
那怎么实现,是否要用到api,如果不用api或其实的C++库,有没有办法实现?
#4
wfpb2007-06-21 15:21
下面是个例子:
#include <Windows.h>
#include <iostream>
using std::cout;
using std::endl;
typedef struct _Mutex
{
    LPTSTR lpStr;
    HANDLE mutex;
    _Mutex(LPTSTR s,HANDLE m){lpStr=s;mutex=m;}
}* _PMutex;
DWORD WINAPI f1(LPVOID lp)
{
   
    for (int i=0;i<100;i++)
    {
        WaitForSingleObject(_PMutex(lp)->mutex,INFINITE);
        cout<<_PMutex(lp)->lpStr<<i<<endl;
        ReleaseMutex(_PMutex(lp)->mutex);
    }
   
    return 0;
}
DWORD WINAPI f2(LPVOID lp)
{
    for (int i=0;i<100;i++)
    {
        WaitForSingleObject(_PMutex(lp)->mutex,INFINITE);
        cout<<_PMutex(lp)->lpStr<<i<<endl;
        ReleaseMutex(_PMutex(lp)->mutex);
    }
    return 0;
}
void main()
{
    HANDLE hMutex=CreateMutex(NULL,FALSE,NULL);
    HANDLE hThread1=CreateThread(NULL,0,f1,(LPVOID)new _Mutex(\"first: \",hMutex),0,NULL);
    HANDLE hThread2=CreateThread(NULL,0,f1,(LPVOID)new _Mutex(\"second: \",hMutex),0,NULL);
    Sleep(1000);
    CloseHandle(hThread1);
    CloseHandle(hThread1);
}
#5
ioriliao2007-06-21 15:23
谢谢,不过我想要的不是api的实现,没什么意思.
#6
ioriliao2007-06-21 20:41
等了很久,乍地没人回贴了.....
#7
herbert_19872007-06-21 21:10

来一个并行执行D:

#include <iostream>

using namespace std;

int main()
{

for (int i=0 , int k = 0; i<10, k < 10; i++, k++)
{
cout << "i = " << i << endl;
cout << "k = " << k << endl;

}

cin.get();
return 0;
}

开玩笑D.

#8
ioriliao2007-06-21 21:50
#9
百年不亮2007-06-21 22:25
楼主又吃饱了没事干,瞎折腾.

显然这是需要多线程的,C++没有在语言层支持多线程,因为在不同的系统平台上有不同的实现,需要多线程就要去学特定系统的实现.

语言标准只是悬在空中的东西,没有与运行的系统对接连个printf()都实现不.你如果不想学底层实现,只想在语言层研究学JAVA去吧.

想下在WINDOWS下运行一个可执行程序,这个程序必须是PE文件结构.你设计编译器,需要研究词法分析,然后就是汇编为可执行程序,不讨论运行平台,难道你想做个在Windows和Linux中都可以工作的编译器?除非是JAVA那样的语言,不过还要个JVM,这个JVM在不同的系统中实现也是不一样的.世上那里有真正的空中楼阁.
#10
ioriliao2007-06-21 22:42
那么,系统的中的多线程就是怎么样实现的呢.
我想,我提的这个问题不是空中楼阁,因为系统也是C实现的.
如果要去做另一个系统,如果在win下进行开发,那未要实现
这个系统的多线程,岂不是要调用 win的api.

#11
百年不亮2007-06-21 22:53
以下是引用ioriliao在2007-6-21 22:42:51的发言:
那么,系统的中的多线程就是怎么样实现的呢.
我想,我提的这个问题不是空中楼阁,因为系统也是C实现的.
如果要去做另一个系统,如果在win下进行开发,那未要实现
这个系统的多线程,岂不是要调用 win的api.


在win下进行开发另一个系统,你需要一个可以交叉编译的编译器.你看看嵌入式的开发过程,针对特定的处理器,编译为特定的指令.

我对你调用 win的api的说法是哭笑不得,你开发一个系统就是开发系统内核,然后又内核提供自己的API.感觉你知识面不够宽,有些东西缺乏常识性了解.

对于多线程就是怎么样实现的,你找本WINDOWS编程的书,推荐微软的<<windows核心编程>>

#12
ioriliao2007-06-21 23:02
你说我的这种想法是空中楼阁,所以我只有这么说让你哭笑不得的api了.
如果你告诉我如果不用api去实现多线程得用上汇编,那未,我无言.
#13
百年不亮2007-06-21 23:08
不是说用上汇编就行的.进程和线程都是操作系统管理的,由操作系统负责把CPU的时间片分配给线程.进程和线程的调度是操作系统的工作,你不用API调用系统内核想自己实现的话,你就抢了OS的饭碗,你自己写操作系统算了.
#14
zcs3022007-06-22 12:54

那个.....百年说对了.....
微观上还是单线程的,只是因为系统轮流让某个进程(线程)得到cpu才让我们觉得是并行的而已.....
要实现并行...当然要用api申请一个新的线程了.....

#15
I喜欢c2007-06-22 13:22

显然是不可能的...

#16
ioriliao2007-06-22 13:39
#17
smartwind2007-06-22 16:12
回复:(ioriliao)[求助][讨论]如何使两个for并行执行...
可以用goto,如下:
LOOP1:i++;
      //your code
      if(/*条件2*/)
        goto LOOP2;
      else if(/*条件1*/)
        goto LOOP1;
      else
        goto OVER;
LOOP2:k++;
      //your code
      if(/*条件1*/)
        goto LOOP1;
      else if(/*条件2*/)
        goto LOOP2;
      else
        goto OVER;
OVER:    //other code

这样可以算是并行了
#18
I喜欢c2007-06-22 18:02



显然这不是楼主所要的...
没有可能实现...

#19
ioriliao2007-06-22 18:17
我说的是for!
1