练习

来源:互联网 发布:linux安装jdk报错 编辑:程序博客网 时间:2024/05/01 18:29
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <pthread.h>


pthread_mutex_t lock;//互斥锁
pthread_cond_t cond_create;//创建表的条件变量
pthread_cond_t cond_menu;//创建菜单的条件变量
pthread_cond_t cond_insert;//插入用户的条件变量
pthread_cond_t cond_delete;//删除用户的条件变量
pthread_cond_t cond_update;//更新信息的条件变量
pthread_cond_t cond_find;//查询用户的条件变量
pthread_cond_t cond_display;//显示所有信息的条件变量
pthread_cond_t cond_quit;//主线程结束的条件变量
//用于初始化互斥锁和条件变量
int init_mutex_and_cond()
{
    pthread_mutex_init(&lock,NULL);
pthread_cond_init(&cond_create,NULL);
pthread_cond_init(&cond_menu,NULL);
pthread_cond_init(&cond_insert,NULL);
pthread_cond_init(&cond_delete,NULL);
pthread_cond_init(&cond_update,NULL);
pthread_cond_init(&cond_find,NULL);
pthread_cond_init(&cond_display,NULL);
pthread_cond_init(&cond_quit,NULL);
return 0;
}
int flag = 0;//用于判断除主线程和创建表线程外的其他所有工作线程结束的标志
void* create_table(void* argv)//创建数据表
{
sqlite3* db = (sqlite3*)argv;
char *errmsg = NULL;
char *sql;
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_create,&lock);
sql = "create table if not exists address_book (no integer primary key,name text,age integer,sex text,address text);";
if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("operator failed:%s\n",errmsg);
exit(-1);
}
else
{
printf("此时表已经在数据库中!\n");
}
pthread_mutex_unlock(&lock);
return (void*)0;
}
void* insert_record(void* argv)//该函数用于录入
{
sqlite3* db = (sqlite3*)argv;
char *errmsg = NULL;
int no;//编号
char sql[100];
char name[20];
char age[2];
char sex[2];
char address[50];
while(1)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_insert,&lock);
if(flag)
{
pthread_mutex_unlock(&lock);
break;
}
printf("姓名:\n");
scanf("%s",name);
printf("年龄:\n");
scanf("%s",age);
printf("性别:\n");
scanf("%s",sex);
printf("地址:\n");
scanf("%s",address);
sprintf(sql,"insert into address_book(name,age,sex,address) values ('%s','%s','%s','%s')",name,age,sex,address);
if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("创建用户失败:%s\n",errmsg);
exit(-1);
}
else
{
printf("用户创建成功!\n");
}
pthread_mutex_unlock(&lock);
sleep(1);
pthread_cond_signal(&cond_menu);
}
return(void*)0;
}
int displayed(void *para,int n_col,char **col_value,char **col_name)//回调函数
{
int i;
printf("总列数为:%d\n",n_col);
for ( i = 0 ; i < n_col ; i++)
{
printf("字段名:%s-->数值:%s\n",col_name[i],col_value[i]);
}
printf("----------------------------------------------\n");
return 0;
}
void* find_people(void* argv)//该函数用于查询,由于有select所以要有回调函数
{
sqlite3* db = (sqlite3*)argv;
char *errmsg = NULL;
char sql[100];
char name[20];
char ret;
while(1)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_find,&lock);
if(flag)
{
pthread_mutex_unlock(&lock);
break;
}
   printf("请输入需要查找的姓名:\n");
   scanf("%s",name);
   sprintf(sql,"select * from address_book where name= '%s'",name);
        if (SQLITE_OK != sqlite3_exec(db,sql,displayed,NULL,&errmsg))
    {
   printf("find failed:%s\n",errmsg);
   exit(-1);
    }
else
{
printf("成功查询用户信息!\n");
}
pthread_mutex_unlock(&lock);
sleep(1);
pthread_cond_signal(&cond_menu);
}
return(void*)0;
}


void* del_people(void* argv)
{
sqlite3 *db = (sqlite3*)argv;
char *errmsg = NULL;
char name[20];
char sql[100];
char ret;
while(1)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_delete,&lock);
if(flag)
{
pthread_mutex_unlock(&lock);
break;
}
    printf("请决定你要删除哪位联系人:\n");
    scanf("%s",name);
     sprintf(sql,"delete from address_book where name = %s;",name);
    if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
   printf("delete failed:%s\n",errmsg);
   exit(-1);
   }
else
{
printf("删除成功!\n");
}
}
pthread_mutex_unlock(&lock);
sleep(1);
pthread_cond_signal(&cond_menu);
}
void* change_people(void* argv)
{
sqlite3* db = (sqlite3*)argv;
char *errmsg=NULL;
char oldname[20];
char name[20];
char age[2];
char sex[2];
char address[50];
char sql[100];
char ret;
while(1)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_update,&lock);
if(flag)
{
pthread_mutex_unlock(&lock);
break;
}
printf("请输入需要修改的用户姓名:");
printf("%s",oldname);
    printf("请选择需要修改的项目:\n");
    printf("1.姓名 2.年龄 3.性别 4.住址\n");
    while(1)
{
printf("请输入需要操作的序号:\n");
scanf("%c",&ret);
if(ret >= '1' || ret <= '3')
{
break;
}
else
{
printf("输入有误,重新输入!\n");
}
}
     switch(ret)
    {
case '1':
   printf("请输入姓名:\n");
   scanf("%s",name);
           sprintf(sql,"update address_book set name = '%s' where name = '%s';",name,oldname);
  break;
   case '2':
   printf("请输入年龄:\n");
   scanf("%s",sex);
                sprintf(sql,"update address_book set age = '%s' where name = '%s';",age,oldname);
break;
case '3':
printf("请输入性别:\n");
                sprintf(sql,"update address_book set sex = '%s' where name = '%s';",sex,oldname);
break;
   case '4':
printf("请输入地址:\n");
                sprintf(sql,"update address_book set address = '%s'where name = '%s';",address,oldname);
break;
}
    if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
    printf("change failed:%s\n",errmsg);
    exit(-1);
    }
else
{
printf("修改成功!\n");
}
pthread_mutex_unlock(&lock);
sleep(1);
pthread_cond_signal(&cond_menu);
}
return(void*)0;

}
void* iquire_nocb(void* argv)
{
sqlite3* db = (sqlite3*)argv;
int row,column;
char **azresult;//用于存放结果
char *sql;
char *errmsg;
int i;
while(1)
{
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_display,&lock);
if(flag)
{
pthread_mutex_unlock(&lock);
break;
}
    sql = "select *from address_book;";
        if (SQLITE_OK != sqlite3_get_table(db,sql,&azresult,&row,&column,&errmsg))
    {
    printf("operator error:%s\n",errmsg);
   exit(-1);
    }
    printf("行:%d ,列:%d\n",row,column);
    for ( i = 0 ; i < (row+1)*column ; i++)
    {
    printf("%10s",azresult[i]);
    if((i+1)%column == 0)
   {
   printf("\n");
   }
    }
        sqlite3_free_table(azresult);//由于相当于调用了malloc函数,所以必须释放空间
pthread_mutex_unlock(&lock);
sleep(1);
pthread_cond_signal(&cond_menu);
}
    return(void*)0;
}
void* menu(void* argv)
{
    sqlite3* db = (sqlite3*)argv;
char num;
while(1)
{
if(flag)
{
break;
}
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_menu,&lock);
    printf("/***************欢迎使用通信录****************/\n");
    printf("/*               1.添加联系人                */\n");
    printf("/*               2.查询联系人                */\n");
    printf("/*               3.删除联系人                */\n");
    printf("/*               4.查看全部联系人            */\n");
    printf("/*               5.修改联系人                */\n");
    printf("/*               6.退出                      */\n");
    printf("/*********************************************/\n");
while(1)
{
       printf("请输入你所需要的操作:\n");
       scanf(" %c",&num);
if(num <= '0' || num >= '7')
{
printf("输入错误,重新输入!\n");
}
else
{
break;
}
}
pthread_mutex_unlock(&lock);
    switch(num)
    {
case '1':
pthread_cond_signal(&cond_insert);
break;
case '2':
pthread_cond_signal(&cond_find);
   break;
case '3':
pthread_cond_signal(&cond_delete);
break;
case '4':
pthread_cond_signal(&cond_display);
break;
case '5':
pthread_cond_signal(&cond_update);
   change_people(db);
case '6':
flag = 1;
pthread_cond_signal(&cond_insert);
sleep(1);
pthread_cond_signal(&cond_find);
sleep(1);
pthread_cond_signal(&cond_delete);
sleep(1);
pthread_cond_signal(&cond_display);
sleep(1);
pthread_cond_signal(&cond_update);
sleep(1);
pthread_cond_signal(&cond_quit);
break;
}
}
return (void*)0;
}


int main()
{
    sqlite3 *db = NULL;//句柄


pthread_t tid_create;
pthread_t tid_menu;
pthread_t tid_insert;
pthread_t tid_delete;
pthread_t tid_update;
pthread_t tid_find;
pthread_t tid_display;


int ret;//定义函数返回值
init_mutex_and_cond();//初始化
    ret = sqlite3_open("mydatabase.db",&db);
if (ret != SQLITE_OK)//错误
{
perror("sqlite open");
exit(-1);
}
else
{
printf("u have opened a sqlites database successfully!\n");
}
//创建表线程
ret = pthread_create(&tid_create,NULL,create_table,(void*)db);
if(ret == -1)
{
printf("创建线程出错!\n");
exit(-1);
}
sleep(1);
pthread_cond_signal(&cond_create);
ret = pthread_join(tid_create,NULL);
if (ret == -1)
{
printf("等待表线程出错!\n");
exit(-1);
}
//创建其他工作线程
ret = pthread_create(&tid_menu,NULL,menu,(void*)db);
if(ret == -1)
{
printf("创建菜单线程出错!\n");
exit(-1);
}
ret = pthread_create(&tid_insert,NULL,insert_record,(void*)db);
if(ret == -1)
{
printf("创建插入线程出错!\n");
exit(-1);
}
ret = pthread_create(&tid_delete,NULL,del_people,(void*)db);
if(ret == -1)
{
printf("创建删除线程出错!\n");
exit(-1);
}
ret = pthread_create(&tid_update,NULL,change_people,(void*)db);
if(ret == -1)
{
printf("创建更新线程出错!\n");
exit(-1);
}
ret = pthread_create(&tid_find,NULL,find_people,(void*)db);
if(ret == -1)
{
printf("创建查询线程出错!\n");
exit(-1);
}
ret = pthread_create(&tid_display,NULL,iquire_nocb,(void*)db);
if(ret == -1)
{
printf("创建显示线程出错!\n");
exit(-1);
}
sleep(1);
pthread_cond_signal(&cond_menu);


pthread_mutex_lock(&lock);
pthread_cond_wait(&cond_quit,&lock);
sleep(1);
    ret = pthread_join(tid_menu,NULL);
if(ret == -1)
{
printf("等待菜单线程出错!\n");
exit(-1);
}
    ret = pthread_join(tid_insert,NULL);
if(ret == -1)
{
printf("等待插入线程出错!\n");
exit(-1);
}
    ret = pthread_join(tid_delete,NULL);
if(ret == -1)
{
printf("等待删除线程出错!\n");
exit(-1);
}
    ret = pthread_join(tid_update,NULL);
if(ret == -1)
{
printf("等待更新线程出错!\n");
exit(-1);
}
    ret = pthread_join(tid_find,NULL);
if(ret == -1)
{
printf("等待查找线程出错!\n");
exit(-1);
}
    ret = pthread_join(tid_display,NULL);
if(ret == -1)
{
printf("等待显示线程出错!\n");
exit(-1);
}


printf("欢迎您的使用!\n");
sqlite3_close(db);


    return 0;
}
0 0