在C中的3个线程之间交替

时间:2014-10-26 22:53:30

标签: c multithreading pthreads

我有3个线程执行独立任务。我试图模仿上下文切换,即I want the first thread to pause its execution and run the 3rd thread and then after some time want the 3rd thread to pause its execution and run the 2nd thread and so on

我目前有以下代码:

if ((result = pthread_mutex_init(&mutex, NULL)) != 0) {
        perror("Error initializing mutex.");
}

for (i = 0; i < 3; i++) {
    int rc = pthread_create(&threads[t], NULL, run_process,
                            (void *) processes[i]);
    }
}

run_process:

void* run_process(void * process_data) {

    pthread_mutex_lock(&mutex);
    Process pdata = (Process *) process_data;
    int result;

    printf("Job %d started.\n", order);

    // do some work
    // the mutex lock makes sure only one thread is here at a time
    for (i = 0; i < (0xFFFFFFFF); i++);

    printf("Job %d finished.\n", order);
    pthread_mutex_unlock(&mutex);
}

这些进程可以独立运行和运行,而不会被其他线程中断。现在我想实现一个上下文切换器,当thread1正在执行“工作”时,它将暂停并从thread1切换到thread2,然后返回到thread1并继续执行。

我是一个关于线程的新手,并且不知道我将如何实现这一点。任何帮助将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

使用pthread_cond_wait,这将允许线程休眠并pthread_cond_signal唤醒特定线程。

线程1等待:

pthread_mutex_lock( &mutex1 ) ;

pthread_mutex_wait( &cond1 , &mutex1 ) ;

pthread_mutex_unlock( &mutex1 ) ;

线程2表示线程1继续:

pthread_mutex_lock( &mutex1 ) ;

pthread_mutex_signal( &cond1 ) ;

pthread_mutex_unlock( &mutex1 ) ;

如果您希望任何线程唤醒任何其他线程,您将需要共享互斥锁和每个线程的条件。

答案 1 :(得分:0)

要执行类似于上面所做的操作,但主线程是调度线程,您可以使用信号量link。您可以让每个线程在启动时等待其信号量。当主线程然后想要运行一个线程时,它会发送到给定的线程信号量,激活给定的线程。

答案 2 :(得分:0)

如果您想要模拟单处理器计算机上的线程调度会发生什么,最简单的方法是使用操作系统processor affinity API让您的进程在单个核心上运行。

答案 3 :(得分:0)

pthreads(可能是在你的操作系统内核的帮助下)已经在做你想做的事了。

当您生成多个线程时,这些线程之间的执行上下文的切换由pthreads处理。在我所知道的大多数实现中,pthreads使用内核提供的工具来执行此操作,但无论哪种方式,您的程序都不需要担心它。

调度程序将自动切换上下文,并且可能会在您的计算机中使用多个CPU核心来同时执行部分或全部内核。

您的程序必须做的是处理线程之间以及线程和任何共享数据结构之间的交互。互操作,条件等待变量等设施用于此目的。

如果您正在尝试实施自己的调度程序,可能作为家庭作业或学习练习的一部分,那么您将需要从根本不使用pthreads开始。如果是这种情况,您可以咨询this answer