C/C++学习 初识多线程 _beginthread()函数

  • 如何创建子线程?可以对子线程进行哪些操作?  
      在Windows下C语言编程可以用_beginthread 函数创建多线程
      功能是创建一个线程并立即执行,直到运行结束或调用_endthread将其终止
      参数1:start_address为线程函数的地址,这个参数即函数名
      参数2:stack_size,新线程的堆栈大小;设为0表示与主线程使用一样的堆栈
      参数3:arg_list,参数列表(没有参数时为NULL)
#include<iostream>
#include<fstream>
#include<process.h>
#include<windows.h>
using namespace std;

void test0(void *){
    cout << "test0" << endl;
}

int main(){
    cout << "start" << endl;
    _beginthread(test0, 0, NULL);
    cout << "over" << endl;
    return 0;
}
// 代码实际输出:
/*
start
over
*/

  注意到test0函数并没有被执行,这是因为main函数是主线程函数,在main函数中创建的线程属于子线程,主线程总是能优先获得CPU的控制权,使得子线程没有执行的机会,在主线程结束时,子线程也被迫结束。在main函数最后加上system("pause"); 语句则test函数将被执行。

  但是,如果有多个子线程,其执行顺序是不确定的:

void test0(void *){
    cout << "test0" << endl;
}

void test1(void *){
    cout << "test1" << endl;
}

int main(){
    cout << "start" << endl;
    _beginthread(test0, 0, NULL);
    _beginthread(test1, 0, NULL);
    cout << "over" << endl;
    system("pause");
    return 0;
}
// 代码实际输出:
/*
start
over
test1
test0
*/

   这样不同线程之间的执行顺序是不确定的,我们希望对线程的执行进行一些操作。

   首先我们引入Sleep()函数,这个函数使当前线程(在哪个函数内部定义Sleep()函数就是哪个线程)至少休眠多少毫秒。

void test0(void *){
    Sleep(50);
    cout << "test0" << endl;
}

void test1(void *){
    cout << "test1" << endl;
}

int main(){
    cout << "start" << endl;
    _beginthread(test0, 0, NULL);
    _beginthread(test1, 0, NULL);
    Sleep(500);
    // _beginthread(test1, 0, NULL);
    cout << "over" << endl;
    system("pause");
    return 0;
}
// 代码实际输出:
/*
start
test1
test0
over
*/

  需要注意的是,Sleep()函数并不能保证线程严格按照规定的时间运行。

  1. 当我们用_beginthread()函数创建一个线程之后,这个线程将马上伺机执行,但是需要等待CPU为其分配资源,线程执行的顺序是不一定的(完全有可能最先创建的线程最后执行);

  2. main函数是主线程函数,在main函数中创建的线程为子线程。在主线程结束后子线程将被迫停止,因此子线程实际上不会被执行;

  3. 为了执行子线程,可以将主线程一直运行,如while(1);或者system("pause"); 

   也可以将某个线程强制休眠,用Sleep()函数。Sleep()函数将指定某个线程至少休眠多长时间。

 

 

 

 

 

 

 

 

 

 

 

  
 
posted @ 2019-06-09 17:38  LiaoQian1996  阅读(5699)  评论(0编辑  收藏  举报