在C中是否可以调用一个睡眠的功能而无需等待睡眠发生?

时间:2014-01-02 08:52:41

标签: c linux multithreading sleep

我有以下代码在Linux系统上将数据页(4KB)分配为char数组。我正在尝试对在不同条件下可以同时创建和编辑多少页面进行一些测试,这是我目前的尝试。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <unistd.h> 

#define KB(size) ( (size) * 1024 )

void allocatePage(){
 int page = KB(4);
 int i;
 char *p;
 p = (char *)malloc(KB(page));
 memset(p, 'T', KB(page));
 for(i=0;i<10;i++){    // this is the part in question
   memset(p, i, KB(page));
   sleep(3);
 }
}

int main(){
    int p = 2;
    int i;
    int *pages = &p;

    for(i=0;i<250;i++){
      *pages = *pages +1;
      printf("\r%-4d pages allocated",i+1, *pages);
      fflush(stdout);
      allocatePage();
    }
    sleep(10);
    printf("\ndone.\n");

    exit(0);
}

有没有办法让它在我调用allocatePage()函数时,main不会等待for循环完成?我想生成多个实例,并让每个实例在一段时间内自我修改。有人知道这样做的好(或可能)方法吗?

1 个答案:

答案 0 :(得分:1)

您可以将allocatePage函数声明为:

void *allocatePage(void * data) {
    // do here your stuffs
}

它已经是线程安全的,因为它只使用局部变量。 然后,在main中,您应该按如下方式更改代码:

pthread_t *threadsList[NUMBER_OF_THREADS] = (pthread_t *) malloc(
        sizeof(pthread_t) * NUMBER_OF_THREADS);
for(i=0;i<NUMBER_OF_THREADS;i++){
  *pages = *pages +1;
  printf("\r%-4d pages allocated",i+1, *pages);
  fflush(stdout);
  pthread_create(&threadsList[i], NULL, &allocatePage, (void *) NULL);
}

之后你可能想等待你的线程完成:

for(int i = 0; i < NUMBER_OF_THREADS; i++)
    pthread_join(threadsList[i], NULL);

在这里,您可以找到关于Linux中线程的非常好的阅读:http://www.advancedlinuxprogramming.com/