如何用gcc在linux下编译多线程c语言程序
使用哪个多线程库的呢,引用相应lib就可以 了
~~~~~~~~~~~~~~~~~~~~~~~~~~~
linux下C语言线程编程
void thread1()
{
int i;
for(i=0;i<8;i++)
{
sleep(1);
printf("thread1
");
}
}
void thread2()
{
int i;
for(i=0;i<8;i++)
{
sleep(1) ;
printf("thread2
");
}
}
int main()
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *)thread1,NULL);//创建线程1
if(ret!=0)
{
printf("Create thread error!
");
exit(1);
}
ret=pthread_create(&id,NULL,(void *)thread2,NULL);//创建线程2
if(ret!=0)
{
printf("Create thread error!
");
exit(1);
}
sleep(10000000);//确保两个线程都结束后,再结束主线程
return 0;
}
上面程序创建了两个线程,多次执行你会发现打印信息顺序是不一样的,仔细揣摩会理解线程的并发执行的奥秘的。
linux下C多线程编程,为每个文件创建一个线程,转换内容大小写
你main里创建完线程就直接退出了,线程还没来的及干活就结束当然不行了。
需要加pthread_join等待,像下面这样:
int main(int argc, char ** argv)
{
pthread_t tid[10];
int i;
for(i=1; i
linux多线程编程中 线程函数有返回值吗?如果有的话,值返回到什么地方?可以有返回值的,线程函数的返回值内核会保存,你需要调用pthread_join函数接收返回值,并且释放线程资源。
Linux 的多线程编程中,如何给线程发信号
不管是在进程还是线程,很多时候我们都会使用一些定时器之类的功能,这里就定时器在多线程的使用说一下。
首先在linux编程中定时器函数有alarm()和setitimer(),alarm()可以提供一个基于秒的定时功能,而setitimer可以提供一个基于微妙的定时功能。
alarm()原型:
#include
unsigned int alarm(unsigned int seconds);
这个函数在使用上很简单,第一次调用这个函数的时候是设置定时器的初值,下一次调用是重新设置这个值,并会返回上一次定时的剩余时间。
setitimer()原型:
#include
int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
这个函数使用起来稍微有点说法,首先是第一个参数which的值,这个参数设置timer的计时策略,which有三种状态分别是:
ITIMER_REAL:使用系统时间来计数,时间为0时发出SIGALRM信号,这种定时能够得到一个精准的定时,当然这个定时是相对的,因为到了微秒级别我们的处理器本身就不够精确。
ITIMER_VIRTUAL:使用进程时间也就是进程分配到的时间片的时间来计数,时间为0是发出SIGVTALRM信号,这种定时显然不够准确,因为系统给进程分配时间片不由我们控制。
ITIMER_PROF:上面两种情况都能够触发
第二个参数参数value涉及到两个结构体:
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
_sec; /* seconds */
_usec; /* microseconds */
};
在结构体itimerval中it_value是定时器当前的值,it_interval是当it_value的为0后重新填充的值。
而timeval结构体中的两个变量就简单了一个是秒一个是微秒。
上面是这两个定时函数的说明,这个函数使用本不是很难,可以说是很简单,但是碰到具体的应用的时候可能就遇到问题了,在多进程编程中使用一般不会碰到什么问题,这里说的这些问题主要体现在多线程编程中。
比如下面这个程序:
#include
#include
#include
#include
#include
#include
void sig_handler(int signo)
{
alarm(2);
printf("alarm signal
");
}
void *pthread_func()
{
alarm(2);
while(1)
{
pause();
}
}
int main(int argc, char **argv)
{
pthread_t tid;
int al;
signal(SIGALRM, sig_handler);
if((al = pthread_create(&tid, NULL, pthread_func, NULL)) < 0)
{
perror("pthread_create");
exit(-1);
}
while(1)
{
printf("main thread
");
sleep(10);
}
return 0;
}
这个程序的理想结果是:
main thread
alarm signal
alarm signal
alarm signal
alarm signal
alarm signal
main thread
可事实上并不是这样的,它的结果是:
main pthread
alarm signal
main pthread
alarm signal
main pthread在linux书上看到,多线程编程需要防止同时访问同一数据,保证数据读写安全。
大多数系统中,需要运行的进程数是可以多于运行它们的CPU个数的。
CPU并发的处理各个线程的时候,是通过处理器在各个线程直接相互切换来实现的。
就是宏观上看的话进程A B是可以同时运行的,微观上是CPU在线程A B中间不停的切换。
你的那个情况可以这样理解 进程A访问数据D了,这时候进程A挂起,进程B运行,进程B也去访问数据D,这就构成了同时访问数据D了。
其实只读的话是可以同时访问的,读写就很复杂了。