Ubuntu 关于种族状况

Ubuntu 关于种族状况,ubuntu,operating-system,mutual-exclusion,Ubuntu,Operating System,Mutual Exclusion,当我编译这个代码时,我可以得到这样的结果 代码是这样的 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> #include <sched.h> void *thread_entry(void *ptr) { int i, j, len; char *str = (char *) ptr; len = strle

当我编译这个代码时,我可以得到这样的结果

代码是这样的

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

void *thread_entry(void *ptr)
      {
int i, j, len;
char *str = (char *) ptr;

len = strlen(str);
for (i = 0; i < 10; i++)   
 {
for (j = 0; j < len; j++) {
    putchar(str[j]);
    sched_yield(); /*to yield CPU*/
                           }
    putchar('\n');
 }
      }

int main()
 {
pthread_t thread1, thread2;
const char *msg1 = "Hello This is Thread 1.";
const char *msg2 = "I am Thread 2.";

pthread_create(&thread1, NULL, thread_entry, (void *) msg1);
pthread_create(&thread2, NULL, thread_entry, (void *) msg2);

pthread_join(thread1, NULL);
pthread_join(thread2, NULL);

return 0;
 }
#包括
#包括
#包括
#包括
#包括
无效*线程输入(无效*ptr)
{
int i,j,len;
char*str=(char*)ptr;
len=strlen(str);
对于(i=0;i<10;i++)
{
对于(j=0;j

这就是代码。我想是因为共同的资源,但我不确定。请告诉我为什么结果是这样。我真的很感激

完全如你所想。 输出是一个共享资源,两个线程同时尝试将字符推送到该资源。 事实上,您已经投入了一个收益,这将鼓励(但不是控制)线程的进出

您没有做任何事情来控制两个线程的交错,不可避免地会得到屏幕截图中显示的乱码输出


在不知道自己想做什么的情况下,没什么好说的。

你已经说过了。这里有比赛条件。您应该在关键部分周围使用
pthread\u mutex\u lock()
pthread\u mutex\u unlock()
。@John不是,谢谢您这么说!!这段代码是特意设计用来突出显示多个线程对输出流的使用。这显然是一项学术活动。如需更多指导,请咨询您的教授/导师。谢谢您,我非常感谢您。。。。但是我想知道我该怎么做?你需要一个pthreads教程。这是一个更大的主题,有一些宽泛的基础原则,通过在StAdvExcel上提问很难得到。我不知道关于pthreads的好教程。最简单的更改是(正如John所建议的那样是否)锁定和解锁共享互斥锁,以确保每个字符串都完整输出。这将(很可能)导致像ababababababab这样的输出,其中两个线程大部分是触发器,但偶尔一个线程在返回之前会运行两次或更多次。一个更有趣的练习是确保通过严格的交替获得阿巴巴输出。