Logo



c多线程编程实战源码(c# 多线程编程实例)

c语言多线程编程问题

C语言中多线程c多线程编程实战源码的实现原理就是线程的原理c多线程编程实战源码,本人只了解Linux下面的C,linux下面的线程,不就是进程中的一个控制流么,相对来说代码很简单,但是原理却是很复杂,很难说清,还需要自己详细学习研究,下面是一个很简单的例子,哪边都能找到,自己运行下看看吧

#include pthread.h

#include stdio.h

#include sys/time.h

#include string.h

#define MAX 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void *thread1()

printf ("thread1 : I'm thread 1\n");

for (i = 0; i MAX; i++)

printf("thread1 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(2);

printf("thread1 :主函数在等c多线程编程实战源码我完成任务吗c多线程编程实战源码?\n");

pthread_exit(NULL);

void *thread2()

printf("thread2 : I'm thread 2\n");

for (i = 0; i MAX; i++)

printf("thread2 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(3);

printf("thread2 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

void thread_create(void)

int temp;

memset(thread, 0, sizeof(thread)); //comment1

/*创建线程*/

if((temp = pthread_create(thread[0], NULL, thread1, NULL)) != 0) //comment2

printf("线程1创建失败!\n");

else

printf("线程1被创建\n");

if((temp = pthread_create(thread[1], NULL, thread2, NULL)) != 0) //comment3

printf("线程2创建失败");

else

printf("线程2被创建\n");

void thread_wait(void)

/*等待线程结束*/

if(thread[0] !=0) { //comment4

pthread_join(thread[0],NULL);

printf("线程1已经结束\n");

if(thread[1] !=0) { //comment5

pthread_join(thread[1],NULL);

printf("线程2已经结束\n");

int main()

/*用默认属性初始化互斥锁*/

pthread_mutex_init(mut,NULL);

printf("我是主函数哦,我正在创建线程,呵呵\n");

thread_create();

printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");

thread_wait();

return 0;

高手进,关于C语言在windows上建立多线程的问题(VC6.0上实现)

东西c多线程编程实战源码,往往实例才是最让人感兴趣c多线程编程实战源码的,老是学基础理论,不动手,感觉没有成就感,呵呵。

下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。

或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。

下面是我们的代码:

/*thread_example.c : c multiple thread programming in linux

*author : falcon

*E-mail : tunzhj03@st.lzu.edu.cn

#include pthread.h

#include stdio.h

#include sys/time.h

#include string.h

#define MAX 10

pthread_t thread[2];

pthread_mutex_t mut;

int number="0", i;

void *thread1()

printf ("thread1 : I'm thread 1\n");

for (i = 0; i MAX; i++)

printf("thread1 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(2);

printf("thread1 :主函数在等我完成任务吗c多线程编程实战源码?\n");

pthread_exit(NULL);

void *thread2()

printf("thread2 : I'm thread 2\n");

for (i = 0; i MAX; i++)

printf("thread2 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(3);

printf("thread2 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

void thread_create(void)

int temp;

memset(thread, 0, sizeof(thread)); //comment1

/*创建线程*/

if((temp = pthread_create(thread[0], NULL, thread1, NULL)) != 0) //comment2

printf("线程1创建失败!\n");

else

printf("线程1被创建\n");

if((temp = pthread_create(thread[1], NULL, thread2, NULL)) != 0) //comment3

printf("线程2创建失败");

else

printf("线程2被创建\n");

void thread_wait(void)

/*等待线程结束*/

if(thread[0] !=0) { //comment4

pthread_join(thread[0],NULL);

printf("线程1已经结束\n");

if(thread[1] !=0) { //comment5

pthread_join(thread[1],NULL);

printf("线程2已经结束\n");

int main()

/*用默认属性初始化互斥锁*/

pthread_mutex_init(mut,NULL);

printf("我是主函数哦,我正在创建线程,呵呵\n");

thread_create();

printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");

thread_wait();

return 0;

下面我们先来编译、执行一下

引文:

falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c

falcon@falcon:~/program/c/code/ftp$ ./thread_example

我是主函数哦,我正在创建线程,呵呵

线程1被创建

线程2被创建

我是主函数哦,我正在等待线程完成任务阿,呵呵

thread1 : I'm thread 1

thread1 : number = 0

thread2 : I'm thread 2

thread2 : number = 1

thread1 : number = 2

thread2 : number = 3

thread1 : number = 4

thread2 : number = 5

thread1 : number = 6

thread1 : number = 7

thread2 : number = 8

thread1 : number = 9

thread2 : number = 10

thread1 :主函数在等我完成任务吗?

线程1已经结束

thread2 :主函数在等我完成任务吗?

线程2已经结束

实例代码里头的注释应该比较清楚了吧,下面我把网路上介绍上面涉及到的几个函数和变量给引用过来。

引文:

线程相关操作

一 pthread_t

pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:

typedef unsigned long int pthread_t;

它是一个线程的标识符。

二 pthread_create

函数pthread_create用来创建一个线程,它的原型为:

extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,

void *(*__start_routine) (void *), void *__arg));

第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了c多线程编程实战源码;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

三 pthread_join pthread_exit

函数pthread_join用来等待一个线程的结束。函数原型为:

extern int pthread_join __P ((pthread_t __th, void **__thread_return));

第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:

extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));

唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。

在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。

互斥锁相关

互斥锁用来保证一段时间内只有一个线程在执行一段代码。

一 pthread_mutex_init

函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进程的不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。

二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np

pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。

注意:

1 需要说明的是,上面的两处sleep不光是为了演示的需要,也是为了让线程睡眠一段时间,让线程释放互斥锁,等待另一个线程使用此锁。下面的参考资料1里头说明了该问题。但是在linux下好像没有pthread_delay_np那个函数(我试了一下,提示没有定义该函数的引用),所以我用了sleep来代替,不过参考资料2中给出另一种方法,好像是通过pthread_cond_timedwait来代替,里头给出了一种实现的办法。

2 请千万要注意里头的注释comment1-5,那是我花了几个小时才找出的问题所在。

如果没有comment1和comment4,comment5,将导致在pthread_join的时候出现段错误,另外,上面的comment2和comment3是根源所在,所以千万要记得写全代码。因为上面的线程可能没有创建成功,导致下面不可能等到那个线程结束,而在用pthread_join的时候出现段错误(访问了未知的内存区)。另外,在使用memset的时候,需要包含string.h头文件哦

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语言,windows多线程编程

点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。

点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。

点量Http/FTP组件的功能简介:

标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。

极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。

多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。

断点续传:点量Http/FTP有优秀的断点续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。

提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。

支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。

支持磁盘缓存:点量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。

支持设置Refer:点量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。

限速功能:点量Http/FTP下载组件可方便的设置下载限速。

多种磁盘分配方式:点量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。

自动搜索镜像加速:点量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。

可提供源码:支付一定的费用,便可以获得全部的点量Http/FTP下载组件的源代码,免除您的所有后顾之忧。

良好的服务:作为点量软件旗下的软件,可享受到点量软件的优秀服务,我们的服务让您如同拥有一个称心的专业员工。

点量Http/FTP 下载组件可以适用于任何Http和FTP下载的领域,让您可以在1天内完成一个完整的Http下载软件的全部功能。比如,您可以用于产品的升级、文件的下载和传输等。

点量Http/FTP内核可以为您带来:

1、大大节省您的开发成本:了解Http和FTP的协议,再去编码、测试,即使对于一个非常有经验的开发人员来说,也需要较长期的时间,此间耗费的人力资源成本和管理成本可谓不少。而使用点量Http/FTP,您就不需要从制造轮子开始制造您的汽车,将注意力集中于车的设计而不是基础设备的建设。何况我们的产品性能是如此优越!

2、强有力的技术支持:作者长期从事下载技术的研发,所提供的技术支持相当于您雇佣了一位具有丰富经验,无需从头学习的开发人员,可以在您的系统建设过程中为您提供整体系统架设的意见。

如果您是个人作为非商业目的使用,您可以自由、免费的使用点量Http/FTP下载组件内核库和演示程序,也期待收到您反馈的意见和建议;如果您是商业使用,那么您需要联系作者申请产品的商业授权。

编写一个多线程的C程序 分割数据并分发给每个线程

不如贴英文原版要求c多线程编程实战源码,中文翻译出来c多线程编程实战源码的要求看着不是很明白

急求!!多线程生产者消费者问题的c语言程序,要源码、已在linux中执行过的文件,最好有截图!!

#include sys/types.h

#include sys/ipc.h

#include sys/shm.h

#include stdio.h

#include semaphore.h

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include stdlib.h

#include unistd.h

#include sys/mman.h

#include sys/time.h

#includestring.h

#define BUFSIZE 4096

#define SEM_IN_TASK "INX_TASK"

#define SEM_OUT_TASK "OUTX_TASK"

sem_t *sem_in;

sem_t *sem_out;

main(int argc, char** argv) // map a normal file as shared mem:

int fd,i;

char *p_map;

char temp;

fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);

//lseek(fd,sizeof(people)*5-1,SEEK_SET);

write(fd,"",1);

p_map = (char*) mmap( NULL,BUFSIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );//建立共享内存

close( fd );

sem_unlink(SEM_IN_TASK);

sem_unlink(SEM_OUT_TASK);

sem_in = sem_open(SEM_IN_TASK,O_CREAT|O_EXCL,0644,1); //1ok

sem_out=sem_open(SEM_OUT_TASK,O_CREAT|O_EXCL,0644,0); //0ok

printf("[sem_in] [%d]\n",sem_in);

printf("[sem_out] [%d]\n",sem_out);

if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)

perror("wangsha-unable to create semaphore");

sem_unlink(SEM_IN_TASK);

sem_unlink(SEM_OUT_TASK);

exit(-1);

memset(p_map,0,BUFSIZE);

while(1)

//printf("---------A waitting B-----------\n\n\n\n");

sem_wait(sem_out);

printf("A:%s\n",p_map );

memset(p_map,'a',100);

sem_post(sem_in);

//printf("------------A emit B-----------\n\n\n\n");

munmap( p_map, BUFSIZE );

printf( "umap ok \n" );

#include sys/mman.h

#include sys/types.h

#include fcntl.h

#include unistd.h

#include sys/types.h

#include sys/ipc.h

#include sys/shm.h

#include stdio.h

#include semaphore.h

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include stdlib.h

#include unistd.h

#include sys/mman.h

#include sys/time.h

#includestring.h

#define SEM_IN_TASK "INX_TASK"

#define SEM_OUT_TASK "OUTX_TASK"

#define BUFSIZE 4096

sem_t *sem_in;

sem_t *sem_out;

main(int argc, char** argv) // map a normal file as shared mem:

int fd =-1;

int i= 0;

char *p_map;

double consumetime = 0.0;

struct timeval process_stat , process_end;

fd=open( argv[1],O_CREAT|O_RDWR,00777 );

p_map = (char*)mmap(NULL,BUFSIZE,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);

sem_in = sem_open(SEM_IN_TASK,O_CREAT,0644,0); //0ok

sem_out=sem_open(SEM_OUT_TASK,O_CREAT,0644,1); //1ok

printf("[sem_in] [%d]\n",sem_in);

printf("[sem_out] [%d]\n",sem_out);

if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)

perror("unable to create semaphore-wang");

sem_unlink(SEM_OUT_TASK);

sem_unlink(SEM_IN_TASK);

exit(-1);

memset(p_map,0,BUFSIZE);

//gettimeofday(process_stat,NULL);

//while(1)

for(i =0;i50000;i++)

memset(p_map,'b',100);

//printf("------------B emit A-----------\n\n\n\n");

sem_post(sem_out);

usleep(200);

sem_wait(sem_in);

//printf("------------A emit B-----------\n\n\n\n");

printf( "B:%s\n",p_map );

//gettimeofday(process_end,NULL);

//consumetime = (double)(process_end.tv_sec - process_stat.tv_sec)*1e6 +(double)(process_end.tv_usec - process_stat.tv_usec)/1e6;

//printf("consumetime:[%f]\n",consumetime);

munmap( p_map,BUFSIZE );

如果对你有帮助,请给分哦,谢谢!

c语言 多线程套接字编程

#include stdlib.h

#include stdio.h

#include errno.h

#include string.h

#include sys/types.h

#include netinet/in.h

#include sys/wait.h

#include sys/socket.h

#define PORT 5000 // The port which is communicate with server

#define BACKLOG 10

#define LENGTH 512 // Buffer length

int main ()

{ int sockfd; // Socket file descriptor

int nsockfd; // New Socket file descriptor

int num;

int sin_size; // to store struct size

char sdbuf[LENGTH]; // Send buffer

struct sockaddr_in addr_local;

struct sockaddr_in addr_remote;

char sendstr[16]= {"123456789 abcde"};

/* Get the Socket file descriptor */

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )

printf ("ERROR: Failed to obtain Socket Despcritor.\n");

return (0);

else

printf ("OK: Obtain Socket Despcritor sucessfully.\n");

/* Fill the local socket address struct */

addr_local.sin_family = AF_INET; // Protocol Family

addr_local.sin_port = htons(PORT); // Port number

addr_local.sin_addr.s_addr = INADDR_ANY; // AutoFill local address

bzero((addr_local.sin_zero), 8); // Flush the rest of struct

/* Blind a special Port */

if( bind(sockfd, (struct sockaddr*)addr_local, sizeof(struct sockaddr)) == -1 )

printf ("ERROR: Failed to bind Port %d.\n",PORT);

return (0);

else

printf("OK: Bind the Port %d sucessfully.\n",PORT);

/* Listen remote connect/calling */

if(listen(sockfd,BACKLOG) == -1)

printf ("ERROR: Failed to listen Port %d.\n", PORT);

return (0);

else

printf ("OK: Listening the Port %d sucessfully.\n", PORT);

while(1)

sin_size = sizeof(struct sockaddr_in);

/* Wait a connection, and obtain a new socket file despriptor for single connection */

if ((nsockfd = accept(sockfd, (struct sockaddr *)addr_remote, sin_size)) == -1)

printf ("ERROR: Obtain new Socket Despcritor error.\n");

continue;

else

printf ("OK: Server has got connect from %s.\n", inet_ntoa(addr_remote.sin_addr));

/* Child process */

if(!fork())

printf("You can enter string, and press 'exit' to end the connect.\n");

while(strcmp(sdbuf,"exit") != 0)

scanf("%s", sdbuf);

if((num = send(nsockfd, sdbuf, strlen(sdbuf), 0)) == -1)

printf("ERROR: Failed to sent string.\n");

close(nsockfd);

exit(1);

printf("OK: Sent %d bytes sucessful, please enter again.\n", num);

close(nsockfd);

while(waitpid(-1, NULL, WNOHANG) 0);

C语言基础网络编程求助 如何实现多线程

#include sys/stat.h

#include fcntl.h

#include errno.h

#include netdb.h

#include sys/types.h

#include sys/socket.h

#include netinet/in.h

#include arpa/inet.h

#include string.h

#include stdlib.h

#include stdio.h

#include unistd.h

#include pthread.h

void*thread(void*);

int client[5],i;

main()

int serverSocket= socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in server_addr;

struct sockaddr_in clientAddr;

int addr_len = sizeof(clientAddr);

//线程

pthread_t id;

pthread_attr_t attr;

pthread_attr_init(attr);////////////////////////////////////////////////

pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);

//创建地址

bzero(server_addr,sizeof(server_addr));

server_addr.sin_family =AF_INET;

server_addr.sin_port = htons(5555);

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

//绑定

bind(serverSocket,(struct sockaddr *)server_addr,sizeof(server_addr));

listen(serverSocket,5);

for(i=0;i5;i++)

client[i] = accept(serverSocket,(struct sockaddr *)clientAddr,(socklen_t*)addr_len);

pthread_create(id,attr,thread,(void *)client[i]);/////////////////////////////////

pthread_join(id,NULL);

close(serverSocket);/////////////////////////

return 0;

void* thread(void* argv)

char buffer[200];

int a=i;

int s_c = *((int*)argv);///////////////////

while(1)

int n = recv(s_c,buffer,sizeof(buffer),0);

if(n 0)

printf("客户端发过来的 : %s\n",buffer);

else

return;

close(s_c);

  c多线程编程实战源码 


评论


最新评论