资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

c语言多线程函数详解,c语言是多线程语言吗

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;

}

C语言多线程的操作步骤

线程创建

函数原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);

返回值:若是成功建立线程返回0,否则返回错误的编号。

形式参数:pthread_t*restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void *(start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。

线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。

函数原型:intpthread_join(pthread_tthread, void **value_ptr);

参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。

返回值:若成功,则返回0;若失败,则返回错误号。

线程退出

函数原型:voidpthread_exit(void *rval_ptr);

获取当前线程id

函数原型:pthread_tpthread_self(void);

互斥锁

创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。

条件锁

创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。

C语言如何实现多线程同时运行

1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。

2、选择弹出对话框中的“Compiler”选项卡。

3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。

4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。

5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。

C语言怎样实现多线程?

首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(mutex); direction =getchar(); pthread_mutex_unlock(mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(.....){ char c; pthread_mutex_lock(mutex); c = direction; pthread_mutex_unlock(mutex); switch(c){ ................ } ................................... } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子

c语言多线程

因为您传入的是t的地址:rc = pthread_create(thread[t], NULL, PrintHello, t);

所以在PrintHello函数中thread_arg = (int)(*((int*)args));读取时会读取到t的最新值,即8.

这是因为主线程一直在执行,for( t = 0; t NUM_THREADS; t++ )很快执行完,跳出循环t的值为8,而在PrintHello中sleep(1);肯定会读取到t的最新值8.

直接传t的值即可,如下:

#includestdio.h

#include stdio.h

#include stdlib.h

#include stdint.h // 加入这个头文件

#include pthread.h

#include unistd.h

#define    NUM_THREADS     8

void *PrintHello(void *args)

{

int thread_arg;

sleep(1);

thread_arg = (int)(uintptr_t)args; //这样读取传来的t的值

printf("Hello from thread %d\n", thread_arg);

return NULL;

}

int main(void)

{

int rc,t;

pthread_t thread[NUM_THREADS];

for( t = 0; t  NUM_THREADS; t++ )

printf("Creating thread %d\n", t);

rc = pthread_create(thread[t], NULL, PrintHello, (void *)(uintptr_t)t); // 这样传t的值

if (rc)

{

printf("ERROR; return code is %d\n", rc);

return EXIT_FAILURE;

}

}

sleep(5);

for( t = 0; t  NUM_THREADS; t++ )

pthread_join(thread[t], NULL);

return EXIT_SUCCESS;

}

C语言多线程实现

多线程随机选号程序

以下程序运行后看起来比较有意思,像一个随机选号程序,但不是完全按照问题所说的写的 可供参考,要改很容易

//多线程随机选号程序示例

#include stdio.h

#include Windows.h

#include ctime

#include cstdlib

#include process.h

bool g_run = true; //是否运行

void userInput(void*) //监视输入的线程函数

{

while (true)

{

if (getchar()=='\n') //是否输入回车

{

g_run = !g_run; //回车运行 回车暂停

}

Sleep(10); //延迟

}

}

int main()

{

srand(time(0)); //随机数种子

_beginthread(userInput,0,NULL); //开线程

while (true)

{

if (g_run)

{

system("cls"); //清屏

int t = rand() % 1000+ 1;//1-1000的随机数

printf("\n %d",t); //输出

}

Sleep(50); //延迟50毫秒

}

return 0;

}


本文标题:c语言多线程函数详解,c语言是多线程语言吗
链接地址:http://cdkjz.cn/article/hcpsij.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220