C语言 多线程(pthread)

mac2024-03-09  28

多线程(pthread)

==============================================================

头文件: #include <pthread.h>

函数原型:

int pthread_create(pthread_t *thread,const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

参数分析:

thread ----新线程ID(如果为NULL,则会创建一个标准属性的线程) attr ----- 线程属性 start_routine ----线程例程 arg -----线程例程参数

返回值:

成功 0 失败 errno

=============================================================== 编译出现的问题:

clentTCP.c: In function ‘main’: clentTCP.c:45:5: error: unknown type name ‘phtread_t’ phtread_t TID; ^

Compile and link with -pthread. 由于pthread_create函数来自于posix库, 所以所在编译的时候需要额外链接线程库 -lpthread

===============================================================

应用

接着上一篇的网络编程TCP客户端:

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #define SERVER_IP "192.168.162.129" #define PORT 6502 //函数声明 void* func(void *); int main(int argc, char const *argv[]) { //创建套接字: int fd_socket = socket(AF_INET , SOCK_STREAM , 0); //配置地址信息: struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = inet_addr(SERVER_IP); //连接服务器: int addrlen = sizeof(addr); int ret = connect(fd_socket, (struct sockaddr *) &addr, addrlen); if(-1 == ret) { perror("connect error\n"); return -1; } else { printf("connect succeed\n"); } //等待来信和回复信息: char *buf = malloc(256); pthread_t TID; void *arg = &fd_socket; ret = pthread_create(&TID, NULL, func, arg); if(0 != ret) { perror("pthread error\n"); } while(1) { bzero(buf, 256); printf("clent:"); fgets(buf, 256, stdin); ret = send(fd_socket, buf, 256, 0); if(-1 == ret) { perror("send error\n"); } /* bzero(buf, 256); ret = recv(fd_socket, buf, 256, 0); if(-1 == ret) { perror("recv error\n"); } else { printf("server: %s\n",buf); }*/ } return 0 ; } //等待来信 void* func(void *arg) { char *buf = malloc(256); int* fd_socket = (int*)arg; while(1) { int ret = recv(*fd_socket, buf, 256, 0); if(-1 != ret) { printf("server:%s\n",buf); } bzero(buf,256); } }

显示的效果就是服务器只要消息发送即可显示在客户端终端上。

最新回复(0)