C 如何使用线程两次运行相同的代码?

C 如何使用线程两次运行相同的代码?,c,linux,multithreading,fork,cpu,C,Linux,Multithreading,Fork,Cpu,我有C语言的代码: int X=0; void main() { X++; } 我怎样才能让我的CPU在不同的内核上几乎同时运行这段代码两次(我并不是要求这种情况发生的成功率为100%) 也许thread能帮上忙 我想在我的眼睛里看到,在运行代码之后,X可能是1,而不是2 如果这很重要的话,我的内核是非抢占式的(linux 2.4)。您好,欢迎来到Stackoverflow。你的程序可以简单到 #include <stdio.h> #include <pthrea

我有C语言的代码:

int X=0;

void main()
{
    X++;
}
我怎样才能让我的CPU在不同的内核上几乎同时运行这段代码两次(我并不是要求这种情况发生的成功率为100%)

也许thread能帮上忙


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


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

您好,欢迎来到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);
}
#包括
#包括
#包括
int x;
void func(void*){
x++;
printf(“x:%d\n”,x);
}
int main(){
pthread_t thread1;
if(pthread_create(&thread1,NULL,&func,NULL)){
perror(“线程创建失败”);
};
func(空);
pthread_join(thread1,NULL);
}
然而,你将得到的是一个所谓的

如果你真的想同时计算一些东西,那么原子可能就是你所需要的:

#include <stdatomic.h>

atomic_int x;

void func(void*) {
    atomic_fetch_add(&x,1);
    printf("x: %d\n", atomic_load(&x));
}
#包括
原子x;
void func(void*){
原子获取添加(&x,1);
printf(“x:%d\n”,原子加载(&x));
}

此外,此默认线程应该仍然适用,您可以使用
pthread\u attr\u setschedpolicy
,但我不确定是否需要详细说明。

如果您想要完全控制哪些内核上运行的线程,您可能需要研究类似的内容。如果您只需要两个线程,并让操作系统根据需要安排它们,那么只需使用。。线程<代码>pthreads库对于LinuxIn来说是相当标准的,简而言之,您不能,因为您没有细粒度的控制何时运行。因此,即使启动两个线程递增该整数,也不太可能得到除2以外的其他结果。但是,如果您想证明在没有同步的情况下递增int是不可靠的,我建议您重复这一点。例如,运行四个线程,每个线程将var增加1M倍。有了这样的设置,再加上智能编译器的限制,我就可以真正看到竞争条件了。@EugeneSh。好吧,让我们简化一下,我想要一些代码,可能会导致我上面描述的情况(不必是100%,但即使是5%也足够)@UlrichEckhardt请阅读我的最后一条评论,它不必是所有运行的情况,但理论上支持这种行为。对于我来说,如果从1000次运行中,这种情况只能发生一次就足够了。XY问题?为什么你关心内核或者几乎同时发生的事情(以及“几乎”的定义是什么)?如果你不等待它,那么主线程将完成,这将让操作系统终止整个进程,包括另一个线程,不管它在做什么。@daniel,你的
main(…)
函数不是程序的真正入口点。真正的入口点在
libc
库中。它设置库,调用main(…),然后在main()返回后,它将删除内容并终止进程。如果允许main()函数在其他线程仍在运行时返回,则库将在这些线程仍在使用时关闭,并在这些线程仍有工作要做时终止进程。@daniel,另请注意:这种行为是C和pthreads特有的。其他编程语言可能会做不同的事情。例如,在Java中,关闭库并终止进程的责任由最后完成的线程承担,而不是由主线程承担。