多线程和并行编程有什么区别?

15

我有一个四核处理器。我用Java编写了类似这样的东西;

Some.java;

public class Some extends Thread {
    private SharedData sharedVal;
    private String name;

    public Some(SharedData val, String threadName) {
        sharedVal = val;
        name = threadName;
    }

    public void run() {
        int temp;
        while(true) {
            temp = sharedVal.GetValue() + 1;
            sharedVal.SetValue(temp);
        }
    }
}

SharedData.java;

public class SharedData {
    private int value;

    SharedData() {
        value = 0;
    }

    public void SetValue(int d) {
        value = d;
    }

    public int GetValue() {
        return value;
    }
}

Program.java;

public class Program {
    public static void main(String[] args) {
        SharedData test = new SharedData();

        Some t1 = new Some(test, "thread1");
        Some t2 = new Some(test, "thread2");
        Some t3 = new Some(test, "thread3");
        Some t4 = new Some(test, "thread4");

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

我运行程序并检查处理器图形,每个处理器部件看起来都在工作约90%。

我的问题是:如果我可以像这样使用系统资源,那么什么是并行编程?我理解错了吗?我看到了一个在C#中使用处理器数量的示例,这是怎么回事?


1
精确副本:https://dev59.com/oXE95IYBdhLWcg3wf98F - Cratylus
1
嗯,也许值得保持开放,因为他在询问他特定的程序而不是一般性问题...我不确定。 - Tudor
3个回答

25

并行编程意味着使用一组资源通过分解工作来在更短的时间内解决问题。这是一个抽象的定义,其依赖于这部分:通过分解工作来在更短的时间内解决问题。你所展示的代码并不是指针对数据来解决问题的并行编程,而只是在多个线程上调用某些方法。虽然这是“并行”的,但它并没有全局地解决问题。

处理器负载的问题与并行编程有关,因为并行编程旨在尽可能让所有计算元素保持繁忙状态。但仅仅让CPU保持忙碌并不意味着你正在进行并行编程。

最后, 并行编程远远超出了多线程,并可以在运行在同一台机器或不同机器上的进程之间进行。


因此,使用多线程方法是并行编程的一部分,但并行编程不仅仅是使用多线程? - Burak Karakuş
@Burak Karakuş:是的,多线程是实现并行性的一种方式,但不是唯一的方式。同时,并非每次使用多线程都意味着并行化。 - Tudor

13

并行编程是一个整体的概念,而多线程只是其中一种具体的实现方式。举个例子,你也可以通过 MapReduce 来进行并行编程,这样每个任务可以在不同系统上的独立进程中运行。另外,多线程程序并不意味着程序一定是并行执行的。在单核机器上运行多线程程序是可能的,此时该程序并不是并行执行。


6

并行编程是多线程的超集(也就是说,多线程是一种实现并行编程的方式,但还有其他实现并行编程的方式,例如多进程程序)。

线程与进程的主要区别在于:

同一进程中的线程可以共享内存资源。

进程必须显式地通信以共享它们希望与其他进程共享的任何信息。


实际上,Parallelism 是多线程的超集,而不是并行编程... - Yousha Aleayoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接