C-如何将一个线程运行几秒钟,然后继续第二个线程

时间:2018-09-11 18:00:28

标签: c multithreading

我正在我的程序上运行,我希望线程1运行2.1秒,在2.1秒之后,我希望线程2运行3.4秒,然后它需要切换回线程1。我设法使两个线程都运行,但是没有给定的时间。要求我使用2个线程。

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

int main() {

    void* taskOne();
    void* taskTwo();

    pthread_attr_t tattr;
    pthread_attr_init(&tattr);

    pthread_t thread1, thread2;

    double seconds1 = 2.1;
    double seconds2 = 3.4;


    pthread_create(&thread1, &tattr, taskOne, NULL);
    pthread_create(&thread2, &tattr, taskTwo, NULL);

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

    return 0;
}

void* taskOne() {
    int i, j, m, n;
    while (1) {
        for (i = 0; i < 5; i++) {
            for (j = 1; j <= 8; j++) {
                printf("thread: 1 periodnumber: %i\n", j);
                for (m = 0; m <= 1250; m++)
                    for (n = 0; n <= 250000; n++);


            }
        }
    }
}

void* taskTwo() {
    int i, j, m, n;
    while (1) {
        for (i = 0; i < 5; i++) {
            for (j = 1; j <= 8; j++) {
                printf("thread: 2 periodnumber: %i\n", j);
                for (m = 0; m <= 2750; m++)
                    for (n = 0; n <= 250000; n++);


            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可以通过调用sleep()函数使线程在任何时间睡眠,但这是“睡眠持续 x秒”而不是“睡眠之后” x秒”。

我能想到的唯一方法是在线程外运行一个计时器,使它们在所需的时间里将它们暂停()到所需的时间,然后发送非杀死信号以在再次需要时将其唤醒

sleep(n)可以工作,但只能处理整数。

此外,我们无法保证在尝试暂停/休眠线程时,您的线程不会忙于阻止I / O,因此,真的重要的是,这确实会发生根据需要,您需要做一些工作来防止阻塞。

答案 1 :(得分:0)

让我重新表达一下您的问题:您希望程序在2.1秒钟内执行一项操作,然后希望它停止执行该操作,而在3.4秒钟内执行另一项操作,然后让您返回做第一件事。

您不需要多个线程。您所需要的只是两个功能look at the clock的一种方式。

#include <time.h>

do_thing_1(double for_how_long) {
    struct timespec start_time;
    clock_gettime(CLOCK_MONOTONIC, &start_time);
    while (elapsed_time_since(&start_time) < for_how_long) {
        ...
    }
}

do_thing_2(double for_how_long) {
    struct timespec start_time;
    clock_gettime(CLOCK_MONOTONIC, &start_time);
    while (elapsed_time_since(&start_time) < for_how_long) {
        ...
    }
}

main(...) {
    do_thing_1(2.1 /*seconds*/);
    do_thing_2(3.4 /*seconds*/);
    do_thing_1(9999999.9);
}

左手练习:实施elapsed_time_since(...)

额外功劳:编写通用的do_thing(function, for_how_long)函数。