【问题标题】:In Ubuntu, Why the sequence is changed?在 Ubuntu 中,为什么顺序会改变?
【发布时间】:2017-08-18 02:21:45
【问题描述】:

我在 Ubuntu 中编译此代码。我做了 10 多次,但我只得到了 AAA BBB CCC 。我相信顺序可以改变,但我不知道为什么。请有人告诉我原因。

#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>

void *thread_entry(void *ptr)
{
char *name = (char *)ptr;

printf("%s-A\n", name);

sleep(1); //sched_yield();

printf("%s-B\n", name);

sleep(1); //sched_yield();

printf("%s-C\n", name);


}

int main()
{
#define MAX_THREAD  3
pthread_t thread[MAX_THREAD];
char *thread_name[MAX_THREAD] = {"thread1", "thread2", "thread3"};
int i;

for (i = 0; i < MAX_THREAD; i++)
    pthread_create(&thread[i], NULL, thread_entry, thread_name[i]);

for (i = 0; i < MAX_THREAD; i++)
    pthread_join(thread[i], NULL);

return 0;
}

【问题讨论】:

    标签: multithreading ubuntu operating-system sleep


    【解决方案1】:

    理论上这是可能的,但您不太可能看到另一个订单。

    您生成 3 个线程,然后其中一个打印“A”并等待 1 秒,直到它打印“B”。一秒钟的睡眠对于其余线程打印“A”来说已经绰绰有余了。 “B”和“C”也一样。

    【讨论】:

    • 我真的很感谢你。但是,如果我将 3threads 制作为 5threads。会很容易看到另一个订单吗?我想知道为什么很难看到另一个订单?再次感谢您!
    • 我想知道为什么订购通常是AAA BBB CCC。再次感谢您
    • 您可以尝试使用更多的线程和更少的时间间隔。 (usleep() 甚至 nanosleep() 而不是 sleep())。但最好的解决方案是强制删除 sleep() 。事实上,你每次都会看到不同的顺序:分别打印每个块的线程的顺序是不同的
    • 我真的很感激。谢谢!!我欠你的
    猜你喜欢
    • 2018-06-13
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2014-02-21
    • 2017-12-09
    相关资源
    最近更新 更多