设为首页 收藏本站
查看: 433|回复: 0

[经验分享] windows 和 linux 多线程

[复制链接]

尚未签到

发表于 2017-6-28 14:14:04 | 显示全部楼层 |阅读模式
  学习了几天多线程技术,做个总结,便于记忆。
  一般 多线程传递参数 为 void*  所以会有一个强制转换过程  (int*) (void *)等,传递多个参数选择 结构体指针。为了避免多个线程访问数据冲突 会有一个 叫做  “临界区”CRITICALSECTION“ 类 ,防止读写数据冲突,
  大概流程是:
  CRITICAL_SECTION cs;
  init CS(cs);
  the one process
  enter CS
  .....
  leaveCS
  DELETE(cs);
  在利用多线程时候,会遇到数据分割的问题 一般的规定是:
  假设 data = N   process_num = M;
  N 能整除M 简单  N/M
  N 不能整除 M  则 M-1 个进程的数据处理数 为 N/(M-1) 最后一个进程处理数为N - (N/(M-1)*(M-1))
  一般利用全局变量完成线程间的简单通信 。当然也有timer定时器控制线程启动 ,和event事件触发线程。
  WINDOWS下 多线程头文件为 process.h
  LINUX下     。。。               pthread.h 另外编译时候 加上 -lpthread
  WINDOWS 新建一个线程 有 CreateThread _beginthread (略过参数)
  LINUX下    。。。            pthread_create
  WINDOWS 冻结解冻线程为 SuspendThread() ResumeThread()
  LINUX下 。。。一般用线程锁  pthread_mutex_lock   pthread_mutex_unlock



/*程序流程为:主线程创建子线程(当前子线程状态为stop停止状态),5秒后主线程唤醒子线程,10秒后主线程挂起子线程,15秒后主线程再次唤醒子线程,20秒后主线程执行完毕等待子线程退出。
代码如下:*/
#include "stdio.h"
#include "unistd.h"
#include "pthread.h"
#include "string.h"
#include "time.h"
#define RUN 1
#define STOP 0
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int status = STOP;
void * thread_function(void)
{
static int i = 0;
while (1)
{   
pthread_mutex_lock(&mut);
while (!status)
{
pthread_cond_wait(&cond, &mut);
}
pthread_mutex_unlock(&mut);
printf("child pthread %d\n", i++);
if (i == 20)
break;
sleep(1);
}   
}
void thread_resume()
{
if (status == STOP)
{   
pthread_mutex_lock(&mut);
status = RUN;
pthread_cond_signal(&cond);
printf("pthread run!\n");
pthread_mutex_unlock(&mut);
}   
else
{   
printf("pthread run already\n");
}   
}
void thread_pause()
{
if (status == RUN)
{   
pthread_mutex_lock(&mut);
status = STOP;
printf("thread stop!\n");
pthread_mutex_unlock(&mut);
}   
else
{   
printf("pthread pause already\n");
}
}
int main()
{
int err;
static int i = 0;
pthread_t child_thread;
#if 0
if (pthread_mutex_init(&mut, NULL) != 0)
printf("mutex init error\n");
if (pthread_cond_init(&cond, NULL) != 0)
printf("cond init error\n");
#endif
err = pthread_create(&child_thread, NULL, (void *)thread_function, NULL);
if (err != 0 )
printf("can't create thread: %s\n", strerror(err));
while(1)
{
printf("father pthread %d\n", i++);
sleep(1);
if (i == 5)
thread_resume();
if (i == 10)
thread_pause();
if (i == 15)
thread_resume();
if (i == 20)
break;
}
if (0 == pthread_join(child_thread, NULL))
printf("child thread is over\n");
return 0;
}


  。。。。。涉及到线程间的同步与异步一般会用到如下函数。。。。。。。。。。。。
  windows 等待线程结束  WaitForSingleObject() WaitForMultipleObjects()
  Linux 。。。   pthread_join()
  windows 退出线程 ExitThread() TerminateThread()/强制结束线程
  linux 退出线程  pthread_exit()
  还有关键的 SIGNAL 没有学习,再UPDATE吧。
  最后附上linux 和windows 多线程测试代码
  linux : gcc test.c -fopenmp -lpthread -o test



#include "stdio.h"
#include "omp.h"
#include "time.h"
#include "unistd.h"
#include "pthread.h"
clock_t start,end;
void* test(void *p){
start = clock();
int i;
for(i=0;i<100000;i++)
usleep(1);
end = clock();
printf("process test    %d\n",end-start);
return ((void *)0);
}

void* test1(void *P){
start = clock();
int i;
#pragma omp parallel for
for(i = 0;i<100000;i++)
usleep(1);
end = clock();
printf("process test1   %d\n",end-start);
return ((void *)0);
}
int main(){
int err;
pthread_t ntid;
pthread_t ntid1;
void** out;

err = pthread_create(&ntid,0,test,0);
if(err !=0) putchar('N');
err =pthread_create(&ntid1,0,test1,0);
if(err !=0) putchar('N');
//test(0);
//test1(0);
printf("Main process\n");
pthread_join(ntid,out);
pthread_join(ntid1,out);

return 0;
}

  windows :



#include <windows.h>
#include <iostream>
#include <process.h>
#include <time.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
CRITICAL_SECTION cs;
int i = 0;
void run(void *){
char num[30];
while (1){
sprintf(num,"title %d",i++);
system(num);
Sleep(1000);
//MessageBox(0,(LPCTSTR)num,(LPCTSTR) num, 0);
}

}

int main(){

int hd[4];
MessageBoxA(0, "1", "1", 0);
//for (int i = 0; i < 4; i++){
hd = _beginthread(run, 0, 0);
//}
WaitForSingleObject(hd, true);
system("pause");
return 0;
}

  参考文献:
  http://www.cnblogs.com/gnuhpc/archive/2012/12/07/2807484.html
  http://blog.csdn.net/zhouruifu2015/article/details/47833985
  http://blog.chinaunix.net/uid-29145190-id-4341878.html
  http://edu.51cto.com/lesson/id-86087.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389021-1-1.html 上篇帖子: Windows下Python读取GRIB数据 下篇帖子: Neo4j 第一篇:在Windows环境中安装Neo4j
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表