0

start_thread 中的线程在 start_activity 线程(主线程)在信号量上休眠时访问 packetList 是否安全。如果没有,那么我如何在它们之间共享资源,请注意访问权限只会被读取,而 packetList 不会被更改。

            class A{
                Vector<packet> packetList;
                A()
                {
                    //packetList initialized here
                }

                void start_thread()
                {
                //start a thread here
                }
                void start_activity()
                {
                    while(true)
                    {
                        //possibly sleep on semephore
                        //do work
                    }
                }
            }
4

2 回答 2

0

您可以访问 Vector,前提是您不对其进行迭代。如果你迭代它,你需要synchronized在那个对象上持有一个锁。

如果您想对工作“数据包”进行排队,我建议您考虑使用 BlockingQueue 来等待添加新任务,或者使用 ExecutorService 将 Queue 与 ThreadPool 相结合。

于 2012-11-07T09:29:41.043 回答
0

如果我理解正确,您的问题是“我正在使用信号量来同步线程访问共享数据结构”的改写 - 在这种情况下,答案是“肯定是”,前提是您对 Vector 的访问与所述完全一致, IE:

while(true)
    {
        //acquire lock
        //do work
        //release lock
    }

并且你在主线程上有一个匹配的结构(即你在做任何工作之前获取锁)——这将确保线程对 Vector 的访问是正确同步的

于 2012-11-07T09:30:35.970 回答