【问题标题】:How to create a very basic thread function in C如何在 C 中创建一个非常基本的线程函数
【发布时间】:2015-08-11 09:26:04
【问题描述】:

我的 c 经验有限,几乎没有使用线程的经验。如果有一种简单的方法可以将“永远”函数包装到线程中并允许 main() 继续运行,请告诉我如何完成。这个例子当然是完全不切实际的,但如果我能让它工作,我认为这是一个很好的起点。也许它甚至不可能?但是很想知道。谢谢!

//
#include <Windows.h>
#include <stdlib.h> 
#include <iostream>
#include <stdio.h>
#include "stdafx.h"

void foreverFunction(); // function prototype

int myNumber=1;

void main()
{

    foreverFunction();   // call forever (looping function), would like get it running as a separate thread so that the code below can continue.
    while (myNumber != 0 ){
        printf("Enter a number (0 to exit): ");
        scanf("%d",&myNumber);
        printf("Entered: %d\n",myNumber);
    }

}


// function below should report the current value of myNumber every second
void foreverFunction(){
while (myNumber>0){
    printf ("\nThis will run until the user enters 0, Last value entered was %d\n",myNumber);
    Sleep(1000);
    }
}

【问题讨论】:

  • 请选择一种语言。
  • 你用的是c++11吗?
  • Windows、Linux、MacOS ??
  • the documentation 能走多远?如果遇到困难,请尝试返回。
  • @Tommy 您可以在项目的属性中禁用预编译的 stdafx 标头。另外,不要害怕编辑您的问题。只要确保这样做时您不会使任何答案无效(cmets 可以)。

标签: c multithreading winapi


【解决方案1】:

对于像您这样的简单程序,您可以使用beginthread()

_beginthread(foreverfunction, 0, NULL);

第一个参数是一个函数指针(你的函数的名字)。第二个是堆栈大小,可以为 0。第三个是您要为函数提供的参数(更具体地说,是指向参数的指针)。如果您有多个参数,则必须将它们打包到一个结构中

您可以在 Windows 中使用的另一个函数是CreateThread() for Linux (POSIX),请参阅 haris 答案

【讨论】:

  • 谢谢。可以使用第一个答案(请参阅 cmets),但我感谢您的意见。
【解决方案2】:

已编辑

如果您使用的是 linux,则可以使用 pthread 来实现此目的。对于您的示例,要使 function 永远运行,您可以执行类似

pthread_t thread1;

pthread_create (&thread1, NULL, (void *) &foreverFunction);
pthread_join(thread1, NULL);

现在,直到main 退出,您的函数才会退出。这由pthread_join() 调用处理。

【讨论】:

    【解决方案3】:

    这是我更新的代码(来自上面的示例),它正在工作并且完全符合我的预期。谢谢大家。

    #include <windows.h>
    #include <WinBase.h>
    #include <stdlib.h> 
    #include <iostream>
    #include <stdio.h>
    #include "stdafx.h"
    #include <process.h>
    
    int myNumber=1;
    
    // function below should report the current value of myNumber every second
    unsigned __stdcall foreverFunction(void* pArguments){
    
    printf("The thread is started...\n");
    
    while (myNumber>0){
        printf ("Selected number: %d\n",myNumber);
        Sleep(1000);
        }
    printf("The thread as exited... \n");
    return NULL;
    }      
    
    void main()
    {
        HANDLE hThread;
        unsigned threadID;
    
        hThread = (HANDLE)_beginthreadex( NULL, 0, &foreverFunction, NULL, 0, &threadID );
    
        while (myNumber != 0 ){
            printf("Enter a number (0 to exit): ");
            scanf("%d",&myNumber);
            printf("Entered: %d\n",myNumber);
        }
    
    }
    

    控制台输出:

    Enter a number (0 to exit): The thread is started...
    Selected number: 1
    Selected number: 1
    Selected number: 1
    Selected number: 1
    Selected number: 1
    3
    Entered: 3
    Enter a number (0 to exit): Selected number: 3
    Selected number: 3
    Selected number: 3
    Selected number: 3
    Selected number: 3
    Selected number: 3
    Selected number: 3
    54
    Entered: 54
    Enter a number (0 to exit): Selected number: 54
    Selected number: 54
    Selected number: 54
    Selected number: 54
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多