【Linux c】线程入门

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <sys/time.h>

void print_msg1(void);
void print_msg2(void);
void thread_create(pthread_t thread[2]);

int main()
{
	pthread_t thread[2];
	thread_create(thread);
	
	sleep(1000);
	return 0;
}

void print_msg1(int fd)
{
	int retval;
	int id=pthread_self();
	printf("Thread1 ID: %x\n",id);
	while(1){
		printf("1111111fd=%d\n",fd);
		//sleep(1);
	}
  
	//pthread_exit(&retval);
	
}

void print_msg2(int fd)
{
	//int retval;
	int id=pthread_self();
	printf("Thread2 ID: %x\n",id);	
	while(1){
		  printf("222222222fd=%d\n",fd);
		//sleep(1);
	}

	//thread_exit(&retval);
}

void thread_create(pthread_t thread[2]){	
    int fd = 33;
	pthread_create(&thread[0],NULL, (void *)(&print_msg1), (void *)fd);
	pthread_create(&thread[1],NULL, (void *)(&print_msg2), (void *)fd);
}

第二组:

#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;
 
 struct argument{
	
	int TS_port;
	int NB_port;
	
};	

void *thread1(void *arg_thread)
{

	struct argument *arg; // 接收传递过来的参数结构体  
    arg = ( struct argument * )arg_thread;	
	
    printf ("thread1 : I'm thread 1\n");


	//for (i = 0; i < MAX; i++){
	
			//int *p;
			//p = k;
			//*p = 111;

			arg->TS_port = 101;
			printf("thread1, arg->TS_port = %d \n", arg->TS_port);	
			
	
	

		
		//sleep(1);
	//}	
	
    printf("thread1 :主函数在等我完成任务吗?\n");
 
    pthread_exit(NULL);
 
}
 
void *thread2(void *arg_thread)
{
		struct argument *arg; // 接收传递过来的参数结构体  
    arg = ( struct argument * )arg_thread;
	
    printf("thread2 : I'm thread 2\n");

	//每隔1秒检查K的值,当k的值变化了,就继续执行,否则,等待
	while(arg->TS_port == 0){					
		printf("thread2,我在等待K...\n");
		sleep(1);
	}	
	
	printf("thread2, k = %d \n", arg->TS_port);
	

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

 
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()
{   
   struct argument arg;
   
   arg.TS_port = 0;
   arg.NB_port = 0;
   
    printf("我是主函数哦,我正在创建线程,呵呵\n");
	
    int temp;
    memset(&thread, 0, sizeof(thread)); //comment1
    //创建线程
    if((temp = pthread_create(&thread[0], NULL, thread1, (void*)&arg)) != 0) //comment2
        printf("线程1创建失败!\n");
    else
        printf("线程1被创建\n");
    if((temp = pthread_create(&thread[1], NULL, thread2, (void*)&arg)) != 0) //comment3
        printf("线程2创建失败");
    else
        printf("线程2被创建\n");
	
    printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
    thread_wait();
	
	printf("main, k = %d \n", arg.TS_port);
	
    return 0;
}


第三组:

//两个函数互斥访问一个全局变量
#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 print(char a[], int num){
	
	int i;
	
	for(i = 0; i < num; i++){
		
		printf("%d\t", a[i]);
	}
	
	printf("\n");
	
	return ;
}
void *thread1()
{	
    printf ("thread1 : I'm thread 1\n");
	
	char a [] = "abcde";	
	print(a, 5);
	
    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 :主函数在等我完成任务吗?\n");
 
    pthread_exit(NULL);
 
}
 
void *thread2()
{
    printf("thread2 : I'm thread 2\n");
		
	char a [] = "abcde";	
	print(a, 5);
	
    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;
}



第四组:

fan给的一个任务

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
//add
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#include <errno.h>

//only write
void test1()
{
	unsigned char * data = NULL;
	int time = 0;
	int size = 0;
	int fd = -1;
	int i = 0;
	int ret = 0;
	
	printf("How many times do you want to send:");
	scanf("%d", &time);
	
	printf("packet size(<2000):");
	scanf("%d", &size);

	printf("time = [%d], size = [%d]\n", time, size);

	data = (unsigned char *)malloc(size - 4);
	
	for(i=0; i< size-4; i++)
		data[i] = i;
	
	fd = open("/dev/umts_ipc0", O_RDWR);
	if(fd != -1)
	{
		for (i=0; i<time; i++) {
			ret = write(fd, data, size-4);
			if (ret != size-4)
				printf("ret = [%d]\n", ret);
		}
		close(fd);
	}
	else
	{
		printf("Device open failure\n");
	}
	free(data);	
}

//write and read(read after write),check data
void test2()
{
	unsigned char * data_in = NULL;
	unsigned char * data_out = NULL;
	int time = 0;
	int count = 0;
	int size = 0;
	int fd = -1;
	int i = 0;
	int ret = 0;
	int j = 0;
	
	printf("How many times do you want to send:");
	scanf("%d", &time);
	
	printf("How many packets in one time do you want to send:");
	scanf("%d", &count);	
	
	size = 1500;

	printf("time = [%d], count = [%d] size = [%d]\n", time, count, size);

	data_in = (unsigned char *)malloc(size - 4);
	data_out = (unsigned char *)malloc(size);
	
	for(i=0; i< size-4; i++)
		data_in[i] = i;

	memset(data_out, 0, size);
	
	fd = open("/dev/umts_ipc0", O_RDWR);
	if(fd != -1)
	{
		for (i=0; i<time; i++)
		{
			for (j=0; j<count; j++)
			{
				ret = write(fd, data_in, size-4);
				if (ret != size-4)
					printf("ret = [%d]\n", ret);				
			}
			sleep(1);
			for (j=0; j<count; j++)
			{
				ret = read(fd, data_out, size);
				if (memcmp(data_in, data_out+4, size-4) == 0)
					printf("wrtie and read is match\n");
				else
					printf("wrtie and read is not match!!!\n");				
			}
		}
		close(fd);
	}
	else
	{
		printf("Device open failure\n");
	}
	free(data_in);	
	free(data_out);
}

//write and read(read after write),check data
void test3()
{
	unsigned char * data_in = NULL;
	unsigned char * data_out = NULL;
	int time = 0;
	int count = 0;
	int size = 0;
	int fd = -1;
	int i = 0;
	int ret = 0;
	int j = 0;
	
	printf("How many times do you want to send:");
	scanf("%d", &time);
	
	printf("How many packets in one time do you want to send:");
	scanf("%d", &count);	
	
	size = 1500;

	printf("time = [%d], count = [%d] size = [%d]\n", time, count, size);

	data_in = (unsigned char *)malloc(size - 4);
	data_out = (unsigned char *)malloc(size);
	
	for(i=0; i< size-4; i++)
		data_in[i] = i;

	memset(data_out, 0, size);
	
	fd = open("/dev/umts_ipc0", O_RDWR);
	if(fd != -1)
	{
		for (i=0; i<time; i++)
		{
			for (j=0; j<count; j++)
			{
				ret = write(fd, data_in, size-4);
				if (ret != size-4)
					printf("ret = [%d]\n", ret);				
			}
			sleep(1);
			for (j=0; j<count; j++)
			{
				ret = read(fd, data_out, size);
				if (memcmp(data_in, data_out+4, size-4) == 0)
					printf("wrtie and read is match\n");
				else {
					printf("wrtie and read is not match!!! exit!\n");
					close(fd);
					free(data_in);	
					free(data_out);
					return;
				}
			}
		}
		close(fd);
	}
	else
	{
		printf("Device open failure\n");
	}
	free(data_in);	
	free(data_out);
}

int stop = 0;

struct argument{
	
	int fd;
	unsigned int time;
	
};

void alarmhandle(int sig){   
 
	stop = 1;
	
}

void set_alarm(unsigned int time){
	int ret ;
    struct itimerval tick;
	
    tick.it_value.tv_sec = time;  
    tick.it_value.tv_usec = 0;
    tick.it_interval.tv_sec  = 0; 
    tick.it_interval.tv_usec = 0;
	
	signal(SIGALRM, alarmhandle);
    ret = setitimer(ITIMER_REAL, &tick, NULL);

    if(ret != 0){
		
        printf("Set timer error. %s \n", strerror(errno) );
		
        return ;
    }
    printf("Wait!\n");
}

void write_thread(void *arg_thread){
	
	int ret = 0;
	int count = 0;
	int id = 0;
	int i = 0;
	unsigned char data[1024] = {0};	
	struct argument *arg; // 接收传递过来的参数结构体  
    arg = ( struct argument * )arg_thread;		
	
	id = pthread_self();	
	printf("Thread write ID: %x\n",id);
	
	stop = 0;
		
	for(i=0; i< 1024; i++){
		data[i] = i;
	}	

	if(arg->fd != -1){
		
		while(1){
			if (stop == 1) break;
			ret = write(arg->fd, data, sizeof(data)-1);
			count ++;
			
			if (ret > 1)
				printf(" write ret = [%d]\n", ret);
			
			ret = 0;
		}
	}else{
		printf("Device open failure\n");
	}
	
	//calculate
	double bandwidth ;
	bandwidth = (count*1024*8)/arg->time;
	printf("Bandwidth to write = %lf bps\n",bandwidth);
}

void read_thread(void *arg_thread){
	
	int ret = 0;
	int count = 0;
	int id = 0;
	unsigned char data[1024] = {0};	
	struct argument *arg; // 接收传递过来的参数结构体  
    arg = ( struct argument * )arg_thread;		
	
	id = pthread_self();	
	printf("Thread read ID: %x\n",id);
	
	stop = 0;
	
	if(arg->fd != -1){
		
		while(1){
			if (stop == 1) break;
			ret = read(arg->fd, data, sizeof(data)-1);
			count ++;
			
			if (ret > 1)
				printf("read ret = [%d]\n", ret);
			
			stpcpy(data,"");
			ret = 0;
		}
	}else{
		printf("Device open failure\n");
	}
	
	//calculate
	double bandwidth ;
	bandwidth = (count*1024*8)/arg->time;
	printf("Bandwidth to read = %lf bps\n",bandwidth);
	
}
//throughput test on firmware-loopback
void test4()
{
	int fd = -1;
	unsigned char result[1024] = {0};
	unsigned int time = 0;
	struct argument arg;
	pthread_t thread[2];
	
	printf("How many times do you want to send:");
	scanf("%d", &time);
	
	printf("time = [%d], size = [1024]\n", time);		
		
    fd= open("/dev/umts_ipc0", O_RDWR);	
	
	arg.fd = fd;
	arg.time = time;
	
	set_alarm(time);	
	
	pthread_create(&thread[0],NULL, (void *)(&read_thread),  (void*)&arg);	
	pthread_create(&thread[1],NULL, (void *)(&write_thread), (void*)&arg);

	sleep(1000);
	
	close(fd);	
}

void main()
{
	int choice = 0;
	printf("test app version: 0.0.3.20160527_beat\n");
	printf("choose the test case:\n");
	printf("  1-only write\n");
	printf("  2-write and read,check data-if not match-give warning\n");
	printf("  3-write and read,check data-if not match-break\n");
	printf("  4-throughput test on firmware-loopback\n");
	scanf("%d", &choice);

	switch(choice)
	{
		case 1:
			test1();
			break;
		case 2:
			test2();
			break;	
		case 3:
			test3();
			break;	
		case 4:
			test4();
			break;				
		default:
			printf("input error\n");
			break;

	}
}




 

                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值