【问题标题】:How To Run Same Code Twice Using Threads?如何使用线程两次运行相同的代码?
【发布时间】:2021-08-21 16:53:29
【问题描述】:

我在 C 中有这段代码:

int X=0;

void main()
{
    X++;
}

如何让我的 CPU 在不同内核上几乎同时运行两次此代码(我并不是要求 100% 的成功率来实现这种情况)?

也许线程可以在这里提供帮助?


我想在我眼里看到运行代码后X可能是1而不是2。

如果重要的话,我的内核是非抢占式的 (linux 2.4)。

【问题讨论】:

  • 如果您想完全控制哪些内核运行在哪些内核上,您可能需要查看CUDA 之类的内容。如果您只想要两个线程并让操作系统按照它认为合适的方式安排它们,那么只需使用.. 线程。 pthreads 库是 Linux 的标准
  • 简而言之,你不能,因为你没有细粒度的控制什么时候运行。因此,即使启动两个线程递增该整数,也不太可能得到除 2 以外的其他结果。但是,如果您想证明在没有同步的情况下递增 int 是不可靠的,我建议重复此操作。例如,运行四个线程,每个线程将 var 递增 1M 倍。通过这种设置,除非使用智能编译器,否则我可以想象实际看到这种竞争条件。
  • @EugeneSh。好吧,让我们让事情变得更简单,我想要一些可能导致我上面描述的场景的代码(不一定是 100%,但即使是 5% 也足够了)
  • @UlrichEckhardt 请阅读我的最后一条评论,并非所有运行都必须如此,但理论上支持这种行为。如果从 1000 次运行中只发生一次,这对我来说就足够了。
  • XY 问题?为什么你关心核心,或者几乎同时发生的事情(以及“几乎”的定义是什么)?

标签: c linux multithreading fork cpu


【解决方案1】:

您好,欢迎来到 Stackoverflow。你的程序可以很简单

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

int x;

void func(void*) {
    x++;
    printf("x: %d\n", x);
}

int main() {
    pthread_t thread1;
    if (pthread_create(&thread1, NULL, &func, NULL)) {
        perror("Thread creation failed");
    };

    func(NULL);
    pthread_join(thread1, NULL);
}

但是你会得到一个所谓的data race or race condition

如果您真的想同时计算一些东西,那么您可能需要一个原子:

#include <stdatomic.h>

atomic_int x;

void func(void*) {
    atomic_fetch_add(&x,1);
    printf("x: %d\n", atomic_load(&x));
}

此外,这个默认线程应该仍然是合适的,你可以使用pthread_attr_setschedpolicy,但我不确定,否则请详细说明。

【讨论】:

  • 好吧,如果你不等待它,那么主线程就会结束,这会让操作系统终止整个进程,包括另一个线程,不管它在做什么。
  • @daniel,您的main(...) 函数不是程序的真正入口点。真正的入口点在libc 库中。它设置库,调用你的 main(...),然后在你的 main() 返回后,它把东西拆掉并终止进程。如果您允许您的 main() 函数在其他线程仍在运行时返回,则库将在这些线程仍在使用它时关闭,并在这些线程仍有工作要做时终止进程。
  • @daniel,另请注意:这种行为是 C 和 pthread 所特有的。其他编程语言可能会做不同的事情。例如,在 Java 中,关闭库和终止进程的责任由最后完成的线程负责,而不是由主线程负责。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多