我正在我的程序上运行,我希望线程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++);
}
}
}
}
答案 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)
函数。