您的位置:

c语言线程项目,c++多线程项目

本文目录一览:

C语言怎么写线程代码

通常使用CreateThread函数来创建新的线程.(Unix下使用pthread_create函数)

首先指出,线程与线程之间,是并列关系,不会存在"父子线程"的概念.

在Windows平台下,CreateThread函数包含在 Windows.h 文件内,包含此文件即可正常使用.

以下为CreateThread函数的声明:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性属性描述结构体的

//指针,通常可以忽略的.

SIZE_T dwStackSize,//指定新线程初始的栈大小,若不关心,可以用0填充,来要求使用

//默认值

LPTHREAD_START_ROUTINE lpStartAddress,//用来充当线程的函数的指针.

LPVOID lpParameter,//要传递给函数的参数,这个值本身就是那个参数,而不是参数的地址

DWORD dwCreationFlags,//创建的方式,0表示正常,创建后立即开始运行

LPDWORD lpThreadId//用来接受函数反馈的线程ID的指针.

);

用来充当新的线程的函数格式:

DWORD WINAPI ThreadProc(LPVOID);

CreateThread函数若成功了,返回新线程的句柄,若失败了,则返回NULL.

若用CREATE_SUSPENDED填充dwCreation Flags则创建的线程先挂起来,并不直接开始运行,要用ResumeThread函数恢复线程,才能继续运行.

c语言怎么创建线程和使用

用 pthread_t创建线程名字。然后pthread_create开辟线程。

具体使用。

比如有一个函数

void *hello()

{

printf("create pthread!\n");

}

,然后在main函数里面调用,

int main()

{

pthread_t a_thread;

pthread_create(a_thread, NULL, (void *)hello, NULL);

}

这样就完成了hello()函数的创建和使用,接下来hello函数就会在一个线程中运行

c语言如何编写一个简单的多线程程序?

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,

如下:

/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你

生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。

缓冲区有N个,是一个环形的缓冲池。

*/

#include stdio.h

#include pthread.h

#define BUFFER_SIZE 16

struct prodcons

{

int buffer[BUFFER_SIZE];/*实际存放数据的数组*/

pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/

int readpos,writepos; /*读写指针*/

pthread_cond_t notempty;/*缓冲区非空的条件变量*/

pthread_cond_t notfull;/*缓冲区未满 的条件变量*/

};

/*初始化缓冲区*/

void pthread_init( struct prodcons *p)

{

pthread_mutex_init(p-lock,NULL);

pthread_cond_init(p-notempty,NULL);

pthread_cond_init(p-notfull,NULL);

p-readpos = 0;

p-writepos = 0;

}

/*将产品放入缓冲区,这里是存入一个整数*/

void put(struct prodcons *p,int data)

{

pthread_mutex_lock(p-lock);

/*等待缓冲区未满*/

if((p-writepos +1)%BUFFER_SIZE ==p-readpos)

{

pthread_cond_wait(p-notfull,p-lock);

}

p-buffer[p-writepos] =data;

p-writepos++;

if(p-writepos = BUFFER_SIZE)

p-writepos = 0;

pthread_cond_signal(p-notempty);

pthread_mutex_unlock(p-lock);

}

/*从缓冲区取出整数*/

int get(struct prodcons *p)

{

int data;

pthread_mutex_lock(p-lock);

/*等待缓冲区非空*/

if(p-writepos == p-readpos)

{

pthread_cond_wait(p-notempty ,p-lock);//非空就设置条件变量notempty

}

/*读书据,移动读指针*/

data = p-buffer[p-readpos];

p-readpos++;

if(p-readpos == BUFFER_SIZE)

p-readpos = 0;

/*设置缓冲区未满的条件变量*/

pthread_cond_signal(p-notfull);

pthread_mutex_unlock(p-lock);

return data;

}

/*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/

#define OVER (-1)

struct prodcons buffer;

void *producer(void *data)

{

int n;

for( n=0;n1000;n++)

{

printf("%d ------\n",n);

put(buffer,n);

}

put(buffer,OVER);

return NULL;

}

void *consumer(void *data)

{

int d;

while(1)

{

d = get(buffer);

if(d == OVER)

break;

else

printf("-----%d\n",d);

}

return NULL;

}

int main()

{

pthread_t th_p,th_c;

void *retval;

pthread_init(buffer);

pthread_create(th_p,NULL,producer,0);

pthread_create(th_c,NULL,consumer,0);

/*等待两个线程结束*/

pthread_join(th_p, retval);

pthread_join(th_c,retval);

return 0;

}

c语言实现多线程

目录:

Linux操作系统,C语言实现多线程

Windows操作系统,C语言实现多线程

Windows下的多线程(不带停止)

Linux操作系统,C语言实现多线程:

#include stdio.h

#include stdlib.h

#include pthread.h

void * ThreadOne ( void * threadArg )

{

    printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );

    return NULL;

}

int main ( void )

{

    pthread_t ThreadID;   /* 记录线程标识符 */

    void * waitingResult;  /* 等待线程退出的等待结果 */

    int errorCode;         /* 记录线程的错误代码 */

    char * aMessage = "这是线程的参数" ;

    /* 创建并启动线程ThreadOne。若返回值非零,则线程创建失败 */

    errorCode = pthread_create( ThreadID, NULL, ThreadOne, aMessage );

    if ( errorCode != 0 )

    {

        printf ("线程ThreadOne创建失败。错误代码:%d\n", errorCode );

        return EXIT_FAILURE ;

    }

    /* 等待线程标识符为的ThreadID的线程结束 */

    errorCode = pthread_join( ThreadID, waitingResult );

    if ( errorCode != 0 )

    {

        printf ( "等待线程退出等待失败。错误代码:%d\n" , errorCode ) ;

        return EXIT_FAILURE ;

    }

    printf( "线程的返回值是%p\n", waitingResult );

    return EXIT_SUCCESS ;

}

Windows操作系统,C语言实现多线程:

#include stdio.h

#include windows.h

DWORD APIENTRY ThreadOne ( LPVOID threadArg )

{

    printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );

    return 0;

}

int main ( void )

{

    HANDLE hThread;  /* 记录线程句柄 */

    DWORD ThreadID;  /* 记录线程ID号 */

    DWORD waitingResult;  /* 等待线程退出的等待结果 */

    DWORD threadExitCode;  /* 记录线程的返回值 */

    char * aMessage = "这是线程的参数" ;

    /* 创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread */

    hThread = CreateThread ( NULL, 0L, ThreadOne, (LPVOID)aMessage, 0L, ThreadID );

    if ( hThread == NULL )

    {

        printf ("线程ThreadOne创建失败。错误代码:%lu\n", GetLastError() );

        return EXIT_FAILURE ;

    }

    /* 等待线程句柄为的hThread线程结束 */

    waitingResult = WaitForSingleObject ( hThread, INFINITE );

    if ( waitingResult == WAIT_FAILED )

    {

        printf ( "等待线程退出等待失败。错误代码:%lu\n" , GetLastError() ) ;

        return EXIT_FAILURE ;

    }

    if ( GetExitCodeThread ( hThread , threadExitCode ) )

        printf ( "线程的返回值是%lu\n", threadExitCode ) ;

    else

        printf ( "获取线程的返回值获取失败。错误代码:%lu\n" , GetLastError() ) ;

    return EXIT_SUCCESS ;

}

Windows下的多线程:(不带停止)

#include stdio.h

#include windows.h

DWORD WINAPI duoxianchen(LPVOID lpParam);

int main(int argc, char *argv[])

{

int num=0;

CreateThread(NULL,NULL,duoxianchen,num,NULL, NULL);

while(1)

{

num++; 

printf("主线程! %05d\n",nu***eep(40);

}

return 0;

}

DWORD WINAPI duoxianchen(LPVOID lpParam)

{

int* a=lpParam;

while(1) 

{

++*a; 

printf("副线程! %05d 0x%p\n",*a,a); 

Sleep(80);

}

return 0;

}