C++多线程的使用
直接上代码:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include "App/CApp.h"
#define THREAD_NUMS 5
typedef struct {
int num;
char *msg;
} thread_msg;
void *CallFunc(void *arg){
thread_msg msg = *(thread_msg*)arg;
sleep(5-msg.num);
printf("msg num : %d,msg : %s \n",msg.num,msg.msg);
return 0;
}
int main(int argc,char * argv[]){
pthread_t pid[THREAD_NUMS];
thread_msg msg[THREAD_NUMS];
for (int i=0;i<THREAD_NUMS;i++){
msg[i].num = i;
msg[i].msg = (char *)"this is msg...";
int res = pthread_create(&pid[i],NULL,CallFunc,&msg[i]);
if (res != 0){
printf("Create Error:%d\n",i);
}
}
pthread_exit(NULL);
}
线程的分离与结合(忘了转哪里的了)
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用了线程的默认属性,即为非分离状态(即可结合的,joinable,需要回收),这种情况下,原有的线程等待创建的线程结束;只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include "App/CApp.h"
#define THREAD_NUMS 5
void *CallFuncS(void *arg){
int i = *(int*)arg;
sleep(5-i);
printf("num : %d\n",i);
return 0;
}
int main(int argc,char * argv[]){
pthread_t pid[THREAD_NUMS];
pthread_attr_t attr;
int index[THREAD_NUMS];
// init threat can joinable
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
for (int i=0;i<THREAD_NUMS;i++){
index[i] = i;
int res = pthread_create(&pid[i],NULL,CallFuncS,&index[i]);
if (res != 0){
printf("Create Error:%d\n",i);
}
}
pthread_attr_destroy(&attr);
void * status;
for (int i=0;i<THREAD_NUMS;i++){
int res = pthread_join(pid[i],&status);
if (res != 0){
printf("join error:%d\n",i);
}
printf("exit status %d\n",status);
}
printf("main end\n");
}