日期:2014-05-16  浏览次数:20692 次

这种线程安全吗
我用
for(i   =   0;   i   <   6;   i   ++)
        pthread_create(&id[i],   NULL,   thread,   section[i])   ;
也就是说我想开6个线程,但是都是调用同一个函数,只不过参数不一样。
我不知道这样可不可以,调用同一个函数是每次都单独开辟内存空间吗,也就是说这样安全吗?
在thread()函数里都是对局部变量的访问。

------解决方案--------------------
不会有问题, 函数是不会开辟空间的, 代码段就一个, 只是会为你复制不同的参数到棧里.
前提是:
保证你的函数是线程安全级别, 不操作外部变量或者有加锁/互斥.
------解决方案--------------------
如果确保都是访问局部变量,应该是没有问题的吧
------解决方案--------------------
你贴出的代码当然没有问题,
创建六个线程在内存中只是创建了六个PCB,但这六个PCB都没有初始化他们自己的三级页表,都是用当前进程的页表,这六个PCB就是这六个线程存在于现实世界唯一物理形态。至于你看到的六个并行执行的函数实际上是这六个PCB轮流在一个CPU上初始化并执行时的表现而已,然后六个线程包括创建他们的主线程都由系统内核按照内核的作业调度策略来统一调度。所以你这段创建线程代码本身是没有任何问题的。

但是,当六个线程运行起来后,他们到底会不会出问题,很大程度上依赖于它们的内容。由于他们使用相同的页表(就是该进程的页表),所以他们可以共用该页表中的任何变量,包括局部变量和全局变量,由于局部变量其生存期很短,所以如果使用他们,在任何时候它的值都可能消失。一般情况下大多数人会想要在多个线程中使用进程的全局变量,这时,你担心的问题可能出现:当一个两个进程修改一个全局变量时,或一个读一个写时。由于大多数读或者写操作从代码上看是一行,但实际上却是好多个指令或多个指令周期构成。如:strcpy(string1,string2);获i++,++i等,你不能奢望它们能立刻完成。最后的结果就是数据被破坏,错误,且不可预知。最后情况会很复杂。所以为了可靠的对这种处于临界状态的数据进行访问,需要在线程中对这种变量的读写进行保护。就是使这些操作变成能无干扰完成的所谓“原子操作“--就是最小的不可再分的操作。上面所说的是多线程数据共享问题的解决。但现实中还有另外一类多线程问题不能用相同的保护数据方式来解决,比如:你的两个线程分别在模拟两条相交的马路,当一条马路红灯亮起时这条马路需要暂时停止,而另外一条马路开始运行,这样周而复始。你需要在一个线程中监视另外一个线程的状况,据此决定它是运行还是暂停,这就是多线程的时序同步问题。

所以可以看到多线程所涉及到的两大问题:共享数据访问和时序同步,很大程度上依赖于线程代码,从而决定是否需要使用诸如:临界段(critical section),互斥体(mutex),条件变量(condition),信号灯(semaphore)等小工具。