通常,我们使用双引号标识ANSI字符串,比如:”I’m an example. “ 这种类型的字符串,每个字符占用一个字节。当我们想要标识UNICODE字符串时,需要添加前缀L,比如:L”I’m an example. “ 。这种类型的字符串,每个字符占用两个字节。当然,为了适配多语言场景,也设计了一个通用的字符串前缀,即_T(或TEXT),这个前缀也是宏定义,其在源码中的定义如下:
1 2 3 4 5 6 7
#ifdef _UNICODE #define _T(c) L##c #define TEXT(c) L##c #else #define _T(c) c #define TEXT(c) c #endif
structs_info { structsockaddr_incliaddr; int connfd; }; void *do_work(void *arg) { int n,i; structs_info *ts = (struct s_info*)arg; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; /* 可以在创建线程前设置线程创建属性,设为分离态,哪种效率高内? */ pthread_detach(pthread_self()); while (1) { n = Read(ts->connfd, buf, MAXLINE); if (n == 0) { printf("the other side has been closed.\n"); break; } printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &(*ts).cliaddr.sin_addr, str, sizeof(str)), ntohs((*ts).cliaddr.sin_port)); for (i = 0; i < n; i++) buf[i] = toupper(buf[i]); Write(ts->connfd, buf, n); } Close(ts->connfd); }
intmain(void) { structsockaddr_inservaddr, cliaddr; socklen_t cliaddr_len; int listenfd, connfd; int i = 0; pthread_t tid; structs_infots[256];
while (fgets(buf, MAXLINE, stdin) != NULL) { Write(sockfd, buf, strlen(buf)); n = Read(sockfd, buf, MAXLINE); if (n == 0) printf("the other side has been closed.\n"); else Write(STDOUT_FILENO, buf, n); } Close(sockfd); return0; }
if T is integral(1): T fetch_add (T val, memory_order sync = memory_order_seq_cst) volatilenoexcept; T fetch_add(T val, memory_order sync = memory_order_seq_cst)noexcept;
if T is pointer(2) : T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatilenoexcept; T fetch_add(ptrdiff_t val, memory_order sync = memory_order_seq_cst)noexcept;
if T is integral(1): T fetch_sub (T val, memory_order sync = memory_order_seq_cst) volatilenoexcept; T fetch_sub(T val, memory_order sync = memory_order_seq_cst)noexcept;
if T is pointer(2): T fetch_sub (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatilenoexcept; T fetch_sub(ptrdiff_t val, memory_order sync = memory_order_seq_cst)noexcept;