当前位置: 首页 > news >正文

电子商务网站项目计划长沙网络营销优势与劣势

电子商务网站项目计划,长沙网络营销优势与劣势,公司做的网站怎么维护,2021拉新推广佣金排行榜前文再续#xff0c;书接上一回#xff0c;在上一篇文章#xff1a;Linux多线程——使用信号量同步线程中#xff0c;我们留下了一个如何使用互斥量来进行线程同步的问题#xff0c;本文将会给出互斥量的详细解说#xff0c;并用一个互斥量解决上一篇文章中#xff0c;要…前文再续书接上一回在上一篇文章Linux多线程——使用信号量同步线程中我们留下了一个如何使用互斥量来进行线程同步的问题本文将会给出互斥量的详细解说并用一个互斥量解决上一篇文章中要使用两个信号量才能解决的只有子线程结束了对输入的处理和统计后主线程才能继续执行的问题。一、什么是互斥量互斥量是另一种用于多线程中的同步访问方法它允许程序锁住某个对象使得每次只能有一个线程访问它。为了控制对关键代码的访问必须在进入这段代码之前锁住一个互斥量然后在完成操作之后解锁。二、互斥量的函数的使用它们的定义与使用信号量的函数非常相似它们的定义如下[cpp] view plaincopyprint? #include pthread.h   int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);      int pthread_mutex_lock(pthread_mutex_t *mutex);      int pthread_mutex_unlock(pthread_mutex_t *mutex);      int pthread_mutex_destroy(pthread_mutex_t *mutex);   它们的意义就如它们的名字所示的那样成功时返回0失败时返回错误代码它们并不设置errno。pthread_mutex_init函数中的参数mutexattr指定互斥量的属性在这里我们并不关心互斥量的属性所以把它设置为NULL使用默认属性即可。同样的pthread_mutex_lock和pthread_mutex_unlock都是原子操作如果一个线程调用pthread_mutex_lock试图锁住互斥量而该互斥量又被其他线程锁住占用则该线程的pthread_mutex_lock调用就会阻塞直到其他线程对该互斥量进行解锁该线程才能获得该互斥量pthread_mutex_lock调用才会返回。注意使用互斥量的默认属性如果程序试图对一个已经加锁的互斥量调用pthread_mutex_lock程序就会阻塞而又因为拥有互斥量的这个线程正是现在被阻塞的线程所以这个互斥量就永远不会被解锁也就是说程序就会进入死锁的状态。在使用时要多加注意确保在同一个线程中对加锁的互斥再次进行加锁前要对其进行解锁。三、使用互斥量进行线程同步下面以一个简单的多线程程序来演示如何使用互斥量来进行线程同步。在主线程中我们创建子线程并把数组msg作为参数传递给子线程然后主线程调用函数pthread_mutex_lock对互斥量加锁等待输入输入完成后调用函数pthread_mutex_unlock对互斥量解锁从而使线程函数中的对互斥量加锁的pthread_mutex_lock函数返回并执行子线程中的代码。线程函数在把字符串的小写字母变成大写并统计输入的字符数量之后它调用pthread_mutex_unlock对互斥量解锁使主线程能够继续获得互斥量即对其加锁函数返回再次执行输入功能直到主线程再次调用pthread_mutex_unlock对其解锁一直如此重复直到输入end。源文件为lockthread.c源代码如下[cpp] view plaincopyprint? #include unistd.h   #include pthread.h   #include stdlib.h   #include stdio.h   #include string.h         //声明线程函数和互斥量   void* thread_func(void *msg);   pthread_mutex_t mutex;         #define MSG_SIZE 512         int main()   {       int res  -1;       pthread_t thread;       void *thread_result  NULL;       char msg[MSG_SIZE]  {\0};       //初始化互斥量使用默认的互斥量属性       res  pthread_mutex_init(mutex, NULL);       if(res ! 0)       {           perror(pthread_mutex_init failed\n);           exit(EXIT_FAILURE);       }       //创建子线程并把msg作为线程函数的参数传递给thread_func       res  pthread_create(thread, NULL, thread_func, msg);       if(res ! 0)       {           perror(pthread_create failed\n);           exit(EXIT_FAILURE);       }       //输入字符串以串‘end’结束       printf(Input some test. Enter end to finish\n);       //把互斥量mutex加锁以确保同一时间只有该线程可以访问msg中的数据       pthread_mutex_lock(mutex);       while(strcmp(end\n, msg) ! 0)       {           if(strncmp(TEST, msg, 4)  0)           {               strcpy(msg, copy_data\n);           }           else           {               fgets(msg, MSG_SIZE, stdin);           }           //把互斥量mutex解锁让其他的线程可以访问msg中的数据           pthread_mutex_unlock(mutex);           sleep(1);//休眠1秒再继续循环让其他线程有执行的机会           pthread_mutex_lock(mutex);       }       pthread_mutex_unlock(mutex);       printf(\nWaiting for thread finish...\n);       //等待子线程结束       res  pthread_join(thread, thread_result);       if(res ! 0)       {           perror(pthread_join failed\n);           exit(EXIT_FAILURE);       }       printf(Thread joined\n);       //清理互斥量       pthread_mutex_destroy(mutex);       exit(EXIT_SUCCESS);   }   void* thread_func(void *msg)   {       int i  0;       char *ptr  msg;       sleep(1);       //把互斥量mutex加锁以确保同一时间只有该线程可以访问msg中的数据       pthread_mutex_lock(mutex);       while(strcmp(end\n, msg) ! 0)       {           //把小写字母变成大写           for(i  0; ptr[i] ! \0; i)           {               if(ptr[i]  a  ptr[i] z)               {                   ptr[i] - a - A;               }           }           printf(You input %d characters\n, i-1);           printf(To uppercase: %s\n, ptr);           //把互斥量mutex解锁让其他的线程可以访问msg中的数据           pthread_mutex_unlock(mutex);           sleep(1);//休眠1秒再继续循环让其他线程有执行的机会           pthread_mutex_lock(mutex);       }       pthread_mutex_unlock(mutex);       //退出线程       pthread_exit(NULL);   }   运行结果如下程序分析这个程序的工作流程已经说得非常清楚了这里先来说说在main函数和线程函数thread_func中while循环中的sleep(1)语句的作用。可能很多人会认为这个sleep(1)是为了让子线程完成其处理和统计功能所以要让主线程休眠1秒钟来等待子线程的处理统计工作的完成。的确在这里子线程进行的工作十分简单1秒钟内的确可以处理统计完毕。但是这里的sleep(1)并不是为了实现这个功能这两个循环中的sleep(1)是为了让其他的线程有机会被执行到如果在一次的加锁和解锁之间没有这条语句的话则当前的线程将会一直在循环中获得互斥量因为其他的线程没有执行它的代码的时间所以就要用这样的一条语句来给其他的线程一个运行的机会。如果子线程的执行时间超过1秒这个程序还是会正常运行。以这个例子来说在主线程中当输入数据完毕并对互斥量解锁之后并不马上循环对其加锁此时子线程就有了执行的机会它会对互斥量进行加锁同样地当它处理统计完输入的数据后它在进入下一次循环前也休眠1秒让主线程有机会再次运行。而主线程什么时候能够执行取决于子线程何时对互斥量进行解锁。因为如果子线程拥有锁住互斥量则主线程中函数pthread_mutex_lock就不会返回使主线程处于阻塞状态。换句话来说就是只有子线程结束了对输入的处理和统计后主线程才能继续执行向msg中写入数据。看到这里你应该知道之前在使用信号量时我们多用一个信号量也是为了达到这个目的。所以当我们输入TEST时程序有两个输入但还是能正常运行同样解决了之前使用一个信号量时所带来的问题。信号量和互斥量的作用都是保护代码段的互斥设备它们也非常相似。但在本例中与使用信号量相比实现同样的功能如果使用信号量的话则需要两个信号量而使用互斥量的话只需要一个。可以说在本例中使用互斥量更简单。但是我觉得使用互斥量更容易犯错我们可以看到在这个例子中我们需要使用sleep语句来让其他线程获得执行的机会但是在使用信号量的程序它并不需要使用sleep相对来说比较直观。我知道可能是我的实现方法不好但是对于使用互斥量来说我想了很久也想不到不使用sleep的方法。undefined reference to pthread_create undefined reference to pthread_join 问题解决     在编译中要加 -lpthread参数     gcc thread.c -o thread -lpthread     thread.c为你些的源文件不要忘了加上头文件#includepthread.h 我自己的试验例子#include unistd.h #include pthread.h #include stdlib.h #include stdio.h #include string.h//声明线程函数和互斥量 void* thread_func(void *msg); pthread_mutex_t mutex;#define MSG_SIZE 512int main() {int res -1;pthread_t thread;void *thread_result NULL;char msg[MSG_SIZE] {\0};//初始化互斥量使用默认的互斥量属性res pthread_mutex_init(mutex, NULL);if(res ! 0){perror(pthread_mutex_init failed\n);exit(EXIT_FAILURE);}//创建子线程并把msg作为线程函数的参数传递给thread_funcres pthread_create(thread, NULL, thread_func, msg);if(res ! 0){perror(pthread_create failed\n);exit(EXIT_FAILURE);}//输入字符串以串‘end’结束printf(Input some test. Enter end to finish\n);//把互斥量mutex加锁以确保同一时间只有该线程可以访问msg中的数据pthread_mutex_lock(mutex);while(strcmp(end\n, msg) ! 0){if(strncmp(TEST, msg, 4) 0)/*输入的msg是TEST*/{printf(wwwtest1\n);strcpy(msg, copy_data\n);}else/*输入的msg不是TEST*/{printf(wwwtest2\n);fgets(msg, MSG_SIZE, stdin);/*等待用户输入*/}//把互斥量mutex解锁让其他的线程可以访问msg中的数据pthread_mutex_unlock(mutex);sleep(1);//休眠1秒再继续循环让其他线程有执行的机会pthread_mutex_lock(mutex);}pthread_mutex_unlock(mutex);printf(\nWaiting for thread finish...\n);//等待子线程结束res pthread_join(thread, thread_result);if(res ! 0){perror(pthread_join failed\n);exit(EXIT_FAILURE);}printf(Thread joined\n);//清理互斥量pthread_mutex_destroy(mutex);exit(EXIT_SUCCESS); } void* thread_func(void *msg)/*子线程的功能是把主线程的传下来的字母变成大写字母*/ {int i 0;char *ptr msg;sleep(1);//把互斥量mutex加锁以确保同一时间只有该线程可以访问msg中的数据pthread_mutex_lock(mutex);while(strcmp(end\n, msg) ! 0){//把小写字母变成大写for(i 0; ptr[i] ! \0; i){if(ptr[i] a ptr[i] z){ptr[i] - a - A;}}printf(You input %d characters\n, i-1);printf(To uppercase: %s\n, ptr);//把互斥量mutex解锁让其他的线程可以访问msg中的数据pthread_mutex_unlock(mutex);sleep(1);//休眠1秒再继续循环让其他线程有执行的机会pthread_mutex_lock(mutex);}pthread_mutex_unlock(mutex);//退出线程pthread_exit(NULL); } wqfwqf-System-Product-Name:/worksen/lddexamples/muax$ gcc muax.c -o muax -lpthread wqfwqf-System-Product-Name:/worksen/lddexamples/muax$ ./muax Input some test. Enter end to finish wwwtest2 qqq You input 3 characters To uppercase: QQQwwwtest2 TEST You input 4 characters To uppercase: TESTwwwtest1 You input 9 characters To uppercase: COPY_DATAwwwtest2 eee You input 3 characters To uppercase: EEEwwwtest2 endWaiting for thread finish... Thread joined wqfwqf-System-Product-Name:/worksen/lddexamples/muax$
http://www.zqtcl.cn/news/528627/

相关文章:

  • 有哪些是做二手的网站关于网站制作的指标
  • 网站数据库是谁提供空间坐标系做图网站
  • 网站开发的外文文献佛山做网站格
  • 石家庄网站seo服务免费10大看盘软件
  • 自己做网站卖什么给个网站好人有好报2020免费
  • 网站源码安装步骤网站开发用c 语言
  • 网站首页是什么产品网络推广方案
  • 网站首页制作方案南通市规划建设局网站
  • 网站建设费用兴田德润团队西宁网站策划公司
  • 手机价格网站建设用别人备案域名做违法网站
  • 成都武侯区建设厅官方网站石家庄住房和城乡建设部网站
  • 前端做网站的步骤酉阳网站建设
  • 湖北省住房与建设厅网站php做网站访问记录
  • 做网站的公司没有技术吉林北京网站建设
  • 产品设计培训机构哪家好贵州整站优化seo平台
  • 天津网站制作推广wordpress 果酱
  • 写给初学网站开发们的一封信企业网站建设 ppt
  • 做装修网站多少钱做网站百度一下
  • 用asp做网站的可行性分析9免费建网站
  • 网站域名注册商查询徐州集团网站建设报价
  • 句容网站设计公司做网站充值犯法吗
  • 网站建设所用系统网站备案目的
  • 苏州做网站优化公司哪家好网站的大小
  • 四川省住房和城乡建设厅官方网站网站建设图标图片
  • 做影视网站侵权吗评论凡科网站建设怎么样
  • 建设个人网站流程建设游戏网站需要哪些设备
  • 四字母net做网站怎么样河南做网站优化
  • 怎样做网站快照网站当前位置怎么做
  • 网站模板移植现在c 做网站用什么框架
  • 国内专业的室内设计网站盐城网站开发代理商