为啥线程味精以相反的顺序出现?

Posted

技术标签:

【中文标题】为啥线程味精以相反的顺序出现?【英文标题】:Why the threads msg are coming in reverse order?为什么线程味精以相反的顺序出现? 【发布时间】:2011-12-23 05:33:12 【问题描述】:

当我运行此代码时,我会以相反的顺序获得线程消息。如果我创建线程 A 和 B,则 A 的 msg 应该首先出现,然后是 B。同样,如果我创建一个包含 10 个线程的数组,则 msg 应该按顺序打印。如果存在任何同步问题,则消息不应在所有情况下都显示相同的反向行为。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* Required for thread APIs */
#include <pthread.h>

#define NTHREADS        10
int counter = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *print_thread_msg(void *ptr)
        char *message;
        printf("Thread number %ld\n", pthread_self());
        pthread_mutex_lock(&mutex);
        counter++;
        printf("Counter value: %d\n",counter);
        message = (char *) ptr;
        printf("%s \n",message);
        sleep(1);
        pthread_mutex_unlock(&mutex);
        message = (char *) ptr;
        printf("%s \n",message);


int main (void)
        pthread_t threadA, threadB;
        pthread_t thread_id[NTHREADS];

        int i,j;

        char *msgA = "I am thread A";
        char *msgB = "I am thread B";

        pthread_create(&threadA, NULL, print_thread_msg, (void *)msgA);
        pthread_create(&threadB, NULL, print_thread_msg, (void *)msgB);

        for(i=0; i<NTHREADS; i++)
               pthread_create(&thread_id[i], NULL, print_thread_msg, (void *)"print_thread_msg");

        pthread_join(threadA, NULL);
        pthread_join(threadB, NULL);

        for(j=0; j < NTHREADS; j++)
                pthread_join(thread_id[j], NULL);

        printf(" Finally Counter Value : %d\n",counter);

        exit(0);

【问题讨论】:

这里没有错。这是预期的行为,因为线程是不确定的,并且您受调度程序的支配。您无法预测它们何时运行或订单。当我运行你的 pgm 5 时,你的十个“print_thread_msg”线程在 A 或 B 之前运行。每次运行都可能不同。 我认为你是对的。当我在其他系统上运行相同的程序时,它可以正确打印。 【参考方案1】:

您的代码对我来说运行正确。我尝试了 3 个线程。它总是从线程 A 开始,其余的线程随机跟随。您是否尝试在其他系统中运行代码?

【讨论】:

是的,我确实在其他系统上尝试过,它以正确的顺序打印,但我仍然不知道为什么以相反的顺序打印。这可以是随机打印。即使我继续添加新线程,最后一个也会排在第一位。

以上是关于为啥线程味精以相反的顺序出现?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rust 函数和 FFI C++ 函数以相反的顺序执行?

为啥添加两个 .OrderBy(或 .OrderByDescending)语句会以相反的顺序应用排序?

为啥以相反的执行顺序处理 try-with-resource 的抑制异常?

我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?

为啥合并打印顺序相反

为啥 std::bitset 的位顺序相反? [复制]