A. c/c++ linux c 多线程 pthread_detach(id); phthread_join(id,0);
有区别。
只用1可以。同时使用1,2是不可以的。
一般情况下,线程终止后,其终止状态一直会保留到其他线程调用pthread_join获取它的状态为止。但是线程也可以设置为detach状态,这样的线程一旦终止就立即回收它占用的所有资源,而不保留终止状态。
注意:
不能对已经detach状态的线程调用pthread_join。
对一个尚未detach的线程调用phread_join或phread_detach都可以把该线程设置为datach,也就是说,不能对同一线程调用两次pthread_join,或者如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
phtread_join是阻塞式的,需要等待这个线程终止,而phread_datach是不阻塞的,所以可以用phread_datach来销毁终止线程
B. c的多线程实现
#include <stdio.h>
#include <pthread.h>
void thread(void)
{
int i;
for(i=0;i<3;i++)
printf("This is a pthread.\n");
}
int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf ("Create pthread error!\n");
exit (1);
}
for(i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return (0);
}
不算是双核优化哈!也不是并发处理,如果真的让多线程发挥到极致就用多核经较好
C. c语言实现多线程
Linux操作系统,C语言实现多线程
Windows操作系统,C语言实现多线程
Windows下的多线程(不带停止)
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*ThreadOne(void*threadArg)
{
printf("线程开始啦,参数是:%s ",(char*)threadArg);
returnNULL;
}
intmain(void)
{
pthread_tThreadID;/*记录线程标识符*/
void*waitingResult;/*等待线程退出的等待结果*/
interrorCode;/*记录线程的错误代码*/
char*aMessage="这是线程的参数";
/*创建并启动线程ThreadOne。若返回值非零,则线程创建失败*/
errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);
if(errorCode!=0)
{
printf("线程ThreadOne创建失败。错误代码:%d ",errorCode);
returnEXIT_FAILURE;
}
/*等待线程标识符为的ThreadID的线程结束*/
errorCode=pthread_join(ThreadID,&waitingResult);
if(errorCode!=0)
{
printf("等待线程退出等待失败。错误代码:%d ",errorCode);
returnEXIT_FAILURE;
}
printf("线程的返回值是%p ",waitingResult);
returnEXIT_SUCCESS;
}
#include<stdio.h>
#include<windows.h>
DWORDAPIENTRYThreadOne(LPVOIDthreadArg)
{
printf("线程开始啦,参数是:%s ",(char*)threadArg);
return0;
}
intmain(void)
{
HANDLEhThread;/*记录线程句柄*/
DWORDThreadID;/*记录线程ID号*/
DWORDwaitingResult;/*等待线程退出的等待结果*/
DWORDthreadExitCode;/*记录线程的返回值*/
char*aMessage="这是线程的参数";
/*创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread*/
hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);
if(hThread==NULL)
{
printf("线程ThreadOne创建失败。错误代码:%lu ",GetLastError());
returnEXIT_FAILURE;
}
/*等待线程句柄为的hThread线程结束*/
waitingResult=WaitForSingleObject(hThread,INFINITE);
if(waitingResult==WAIT_FAILED)
{
printf("等待线程退出等待失败。错误代码:%lu ",GetLastError());
returnEXIT_FAILURE;
}
if(GetExitCodeThread(hThread,&threadExitCode))
printf("线程的返回值是%lu ",threadExitCode);
else
printf("获取线程的返回值获取失败。错误代码:%lu ",GetLastError());
returnEXIT_SUCCESS;
}
#include<stdio.h>
#include<windows.h>
DWORDWINAPIoxianchen(LPVOIDlpParam);
intmain(intargc,char*argv[])
{
intnum=0;
CreateThread(NULL,NULL,oxianchen,&num,NULL,NULL);
while(1)
{
num++;
printf("主线程!%05d ",nu***eep(40);
}
return0;
}
DWORDWINAPIoxianchen(LPVOIDlpParam)
{
int*a=lpParam;
while(1)
{
++*a;
printf("副线程!%05d0x%p ",*a,a);
Sleep(80);
}
return0;
}
D. C语言如何实现多线程同时运行
1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。
E. Linux C 怎么实现两个线程同步读取两个内存的数据
在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单讲解处理这一类线程安全问题的方法。
一、数据类型
在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,其不存在线程安全问题,因此不在本文讨论的范围之内。全局变量和函数内定义的静态变量,是同一进程中各个线程都可以访问的共享变量,因此它们存在多线程读写问题。在一个线程中修改了变量中的内容,其他线程都能感知并且能读取已更改过的内容,这对数据交换来说是非常快捷的,但是由于多线程的存在,对于同一个变量可能存在两个或两个以上的线程同时修改变量所在的内存内容,同时又存在多个线程在变量在修改的时去读取该内存值,如果没有使用相应的同步机制来保护该内存的话,那么所读取到的数据将是不可预知的,甚至可能导致程序崩溃。
如果需要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量,这就需要新的机制来实现,我们称之为Static memory local to a thread (线程局部静态变量),同时也可称之为线程特有数据(TSD: Thread-Specific Data)或者线程局部存储(TLS: Thread-Local Storage)。这一类型的数据,在程序中每个线程都会分别维护一份变量的副本(),并且长期存在于该线程中,对此类变量的操作不影响其他线程。如下图:
二、一次性初始化
在讲解线程特有数据之前,先让我们来了解一下一次性初始化。多线程程序有时有这样的需求:不管创建多少个线程,有些数据的初始化只能发生一次。列如:在C++程序中某个类在整个进程的生命周期内只能存在一个实例对象,在多线程的情况下,为了能让该对象能够安全的初始化,一次性初始化机制就显得尤为重要了。——在设计模式中这种实现常常被称之为单例模式(Singleton)。Linux中提供了如下函数来实现一次性初始化:
#include <pthread.h>
// Returns 0 on success, or a positive error number on error
int pthread_once (pthread_once_t *once_control, void (*init) (void));
利用参数once_control的状态,函数pthread_once()可以确保无论有多少个线程调用多少次该函数,也只会执行一次由init所指向的由调用者定义的函数。init所指向的函数没有任何参数,形式如下:
void init (void)
{
// some variables initializtion in here
}
另外,参数once_control必须是pthread_once_t类型变量的指针,指向初始化为PTHRAD_ONCE_INIT的静态变量。在C++0x以后提供了类似功能的函数std::call_once (),用法与该函数类似。使用实例请参考https://github.com/ApusApp/Swift/blob/master/swift/base/singleton.hpp实现。
F. Linux下用c实现线程池为什么需要同步和互锁
linux高并发的实现,线程池的实现思想,怎样处理高并发
就比如说,用迅雷看电影。一边下载,一边播放。这个时候下载进程和播放进程,他们两个就有同步的机制,例如:只能播放视频文件中已经下载完成的部分,没有下载的不能播放。
G. LINUX下C语言实现RC4多线程或多进程技术实现快速解密。
线程
可以用pthread_kill函数
传递信号SIGSTOP挂起
传递SIGCONT 恢复
进程
调用系统的stop挂起
或者用kill -stop 挂起
类似的 用SIGCONT 恢复。
H. 请问linux下C编程多线程同步和异步的区别,如何能实现程序的同步和异步编程
同步就是使得两个或者多个进程之间的行为按照一定的时序来执行。比如说线程A完成了某件事,然后线程B才能做某件事。具体一点,就是,线程间的某个动作执行前需要确认一个或者多个其他线程的当前状态。而异步则是多个线程各跑各的,互不干涉。
Linux下的多线程实现由pthread库提供,头文件为pthread.h。多线程最重要的就是要保护好共享资源(用互斥体,mutex),尤其是异步。代码哥哥就不上了,这里关键的不是代码的问题,也不是Linux、Windows的问题,重要的是概念的理解。哥们不妨先研究研究“生产者-消费者”这个常出现在教科书上的模型,这是一个典型的同步问题。就讲这么多了,拜拜。
I. 用C语言在windows或者Linux上面,编写一个多线程程序
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int *pt=(int*)lpParam;
printf("I am tread %d\r\n",*pt);
}
int main()
{
const int Count=4;
int datas[Count];
DWORD dwThreadId[Count];
HANDLE hThread[Count];
int i;
for(i=0;i<Count;i++)
{
datas[i]=i+1;
hThread[i]=CreateThread(NULL,0,ThreadProc,&datas[i],0,&dwThreadId[i]);
}
WaitForMultipleObjects(Count,hThread,TRUE,INFINITE);
for(i=0;i<Count;i++)
{
CloseHandle(hThread[i]);
}
system("PAUSE");
return EXIT_SUCCESS;
}